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
vs2013中C++呼叫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.6中Twisted模組安裝的問題
今天準備學習爬蟲的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] 前言 由於硬件等各種原因需要把大概