1. 程式人生 > >C++ 呼叫 Python3.6中的各種坑

C++ 呼叫 Python3.6中的各種坑

使用Python3.6,在VS2013與VS2017中進行呼叫,其中的遇到了各種坑,將暫時遇到的坑先進行整理;

1:py檔案不能以 test命名,不知道為什麼,以test1,test2之類的命名都可以,但就是不能使用 test命名,否則,找不到函式名,即

    pFunc = PyObject_GetAttrString(pModule, "hello");該程式碼找不到 python 中的 hello()函式;

2:若 .py 檔案中,有語法錯誤,則不能匯入;

3:要匯入.py檔案所在的路徑,如下所示:
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('F:\\C++ WorkSpace\\CallPython\\CallPython')");

其中,修改後的C++程式碼如下所示:

#include <Python.h>
#include <iostream>
#include <string>
using namespace std;


int main(int argc, char* argv[])

{

	//初始化python

	Py_Initialize();

	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('F:\\C++ WorkSpace\\CallPython\\CallPython')");



	//定義python型別的變數

	PyObject *pModule = NULL;

	PyObject *pFunc = NULL;

	PyObject *pArg = NULL;

	PyObject *result = NULL;

	PyObject *pClass = NULL;

	PyObject *pInstance = NULL;

	PyObject *pDict = NULL;



	//直接執行python程式碼

	PyRun_SimpleString("print('python start')");

	//引入模組

	pModule = PyImport_ImportModule("test2");

	if (!pModule)
	{
		cout << "Import Module Failed" << endl;
		system("pause");
		return 0;
	}


	//獲取模組字典屬性
	pDict = PyModule_GetDict(pModule);

	////直接獲取模組中的函式
	pFunc = PyObject_GetAttrString(pModule, "hello");

	//引數型別轉換,傳遞一個字串。將c/c++型別的字串轉換為python型別,元組中的python型別檢視python文件
	pArg = Py_BuildValue("(s)", "hello charity");
	// 呼叫直接獲得的函式,並傳遞引數
	PyEval_CallObject(pFunc, pArg);

	// 從字典屬性中獲取函式
	pFunc = PyDict_GetItemString(pDict, "arg");
	// 引數型別轉換,傳遞兩個整型引數
	pArg = Py_BuildValue("(i, i)", 1, 2);
	// 呼叫函式,並得到 python 型別的返回值
	result = PyEval_CallObject(pFunc, pArg);
	// c 用來儲存 C/C++ 型別的返回值
	int c = 0;
	// 將 python 型別的返回值轉換為 C/C++型別
	PyArg_Parse(result, "i", &c);
	cout << "a+b = " << c << endl;

	// 通過字典屬性獲取模組中的類 
	pClass = PyDict_GetItemString(pDict, "Test");

	if (!pClass)
	{
		cout << "獲取模組中的類失敗" << endl;
		system("pause");
		return 0;
	}

	// 例項化獲取的類
	pInstance = PyInstanceMethod_New(pClass);

	//呼叫類的方法
	result = PyObject_CallMethod(pInstance, "say_hello", "(s,s)", "", "charity");

	//輸出返回值
	char* name = NULL;
	PyArg_Parse(result, "s", &name);   //這個函式的第二個引數相當扯淡,具體看下文的英文,型別使用字元來表示的,例如“s”代表 str "i" 代表int,個人感覺相當扯淡

	printf("%s\n", name);

	PyRun_SimpleString("print('python end')");



	////釋放python

	Py_Finalize();

	system("pause");

	return 0;

}

python程式碼:

def hello(s):
    print("hello world")
    print(s)


def arg(a, b):
    print('a=', a)
    print('b=', b)
    return a + b


class Test:
    def __init__(self):
        print("init")

    def say_hello(self, name):
        print("hello", name)
        return name

執行結果:

python start
hello world
hello charity
a= 1
b= 2
a+b = 3
hello charity
charity
python end
請按任意鍵繼續. . .
 

相關推薦

C++ 呼叫 Python3.6各種

使用Python3.6,在VS2013與VS2017中進行呼叫,其中的遇到了各種坑,將暫時遇到的坑先進行整理; 1:py檔案不能以 test命名,不知道為什麼,以test1,test2之類的命名都可以,但就是不能使用 test命名,否則,找不到函式名,即     pFun

vs2013C++呼叫Python3.5的方法

#include "stdafx.h"  #include <python.h>  #include <iostream>  using namespace std;int main(){string path = "D:/python_test/";

python3.6安裝numpy,pandas,scipy,scikit_learn,matplotlib等數據分析工具

scipy pandas python3.6中安裝numpy scikit_learn matplotlib等數據分析工具 運行環境:python3.6+windows64位1.安裝pip(1)如果在安裝python3.6時,你有勾選關於pip的選項,那麽在python3,6中就會帶有pi

OC呼叫Swift4.0的各種【轉】

原文地址 簡述:最近幾年蘋果主推swift,OC已經很少更新了,處於維護狀態。所以慢慢多了很多OC混編Swift的專案,但是其實swift呼叫OC還是挺簡單的,把OC專案慢慢轉成swift問題不大。swift可以算是OC更上層的語言,我這裡說的坑都是關於Swift轉OC的,很奇葩吧,還有把Swi

深度學習(一)——deepNN模型實現攝像頭實時識別人臉表情(C++和python3.6混合程式設計)

一、背景介紹 最近需要做人臉識別方向的東西,就被分配了新的任務,利用攝像頭實時檢測人臉表情,並製作成一個小軟體,這裡當然要用C++實現,並用C++做成一個介面。 由於博主之前用python做過類似的小程式,因此這裡的模型實現主要採用了python,為了用C++實現介面,這裡採用C++呼叫py

關於Python3.6Twisted模組安裝的問題

今天準備學習爬蟲的scrapy模組,在這之前需要安裝許多別的模組,Twisted就是其一 一開始想著直接用pycharm來安裝就行了,沒想到安裝了一會就報錯了,如下 後來就換到命令提示符來安裝,在官網發現直接pip安裝就行了 pip install Twisted 當我以為一切順利的

C# System.Timers.Timer,程式異常退出後timer依然執行問題

問題背景   C#小白,由於本公司IM系統服務端(java)是本人獨立開發的,加上現在所在專案需要對接IM系統,於是IM的客戶端(C#實現)對接工作就交給我了。於是C#小白的我天真的以為只要呼叫C#端的SDK介面真搞定了。起初都還好,對接工作都很正常,沒什麼大問題。可是隨著時間的不斷流逝,終於在專案組小夥伴

Ubuntu16.04 C++呼叫Python3.5

Ubuntu16.04下C++呼叫Python3.5程式 Python程式 #call.py import sys def call(): print("hello world") if __n

總結iOS 8和Xcode 6各種

專案路徑坑 模擬器的路徑從之前的~/Library/Application Support/iPhone Simulator移動到了~/Library/Developer/CoreSimulator/Devices/這相當的坑爹,之前執行用哪個模擬器直接選擇這個模擬器資料夾進去

django 1.11.16 +Python3.6 + xadmin 的

1、首先安裝就會有一個坑,很多教程的安裝是直接在虛擬環境下使用 pip install xadmin 或者 pip install django-xadmin 事實證明 Django2+xadmin2的版本是行不通的, 正確方法是通過官方的github https://github.co

C++呼叫python3

注:為了方便,我把我在這個過程中的一些問題列在列下面,有很多bug的解決還是能在下面找到答案,希望能幫到你們。 鑑於博主我比較菜,所以這篇部落格其實是建議如果要用C++呼叫還是Python2吧。當然可能一段時間以後有比較好的解決辦法或者python3變得更科學

C++ 呼叫Python3

作為一種膠水語言,Python 能夠很容易地呼叫 C 、 C++ 等語言,也能夠通過其他語言呼叫 Python 的模組。 Python 提供了 C++ 庫,使得開發者能很方便地從 C++ 程式中呼叫 Python 模組。 具體操作可以參考: 官方文件 在呼

Python3.6安裝psycopg2實現對PostgreSQL資料庫的操作

        事先在網上搜索了一大圈,頭都大了,看到那麼多文章寫道在python裡安裝psycopg2的各種坑和各種麻煩,各種不成功。搜尋了一下午,索性外出放鬆。晚飯後,又繼續上psycopg2官網(http://initd.org/psycopg/docs/instal

c呼叫python遇到的那些

首先得保證安裝完整python的元件 我的是debian系統 apt-get install python-dev 編譯c程式時候不能簡單的 gcc ***.c 因為會找不到相關的標頭檔案 需要gcc ***.c -Wall -I/usr/include/python2.

小白在mac的Python2.7及Python3.6安裝Pygame

問題描述:在mac中安裝了兩個版本的Python,終端預設Python2.7, launchpad中可以找到Python3.6.應用程式中存在Python2.7和Python3.6的資料夾 解決:首先安裝pip,安裝過程中感覺系統自帶Python中存有pip,可能也不需要安

C#呼叫C++ DLL的完整方法(解決了各種,Win7下測試可用)

        由於C#直接訪問USB裝置的能力較弱,而C++在這方面則強大許多。因此,考慮通過C++實現讀寫USB裝置,C#呼叫該DLL介面的方式。這個過程中,上網查了一些資料,但是自己動手,仍然會出現這樣或者那樣的問題,因此,記錄下大體步驟,以便後續他人或者自己可以參考

pyinstaller 打包python3.6+PyQt5各種錯誤的解決方案

前言:最近在學習微控制器,老師要求自己寫串列埠通訊的上位機程式,我採用比較簡單的pyqt5+serial模組來完成任務,pycharm測試一切正常,在用pyinstaller打包時出現了很多錯誤,查詢了很多資料後得到了解決,這裡彙總一下解決的方法 1. W

C++專案各種【2018.9.7】

C++專案中的各種坑 更新時間 2018.9.7 最近做C++專案的時候,踩了許多坑。想著如果能夠將它們記錄下來,整理在案,也算是不錯的總結。於是寫下此篇。 2018.9.7 解引用空指標 在執行期的什麼時候會導致崩潰? struct S {

ubuntu如何安裝python3.6

bin www onf 是否 sql then 解決方法 denied config 此處使用命令行方式來安裝Python3.6: sudo wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz

python爬取微博圖片數據存到Mysql遇到的各種python Mysql存儲圖片

字符轉義 process 程序 zha 有一個 utf-8 get ctime python3 本人長期出售超大量微博數據,並提供特定微博數據打包,Message to [email protected] 前言   由於硬件等各種原因需要把大概