亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

C/C++調用python

2019-11-06 08:19:10
字體:
來源:轉載
供稿:網友

程序配置: python3.5 VS2012


Python2.x 也可以參考

1、環境配置 參考:http://blog.csdn.net/chunleixiahe/article/details/50410208這篇文章有詳細介紹

2、第一個程序(調用無參函數)

使用到的Python程序:

# hello.py# coding:utf-8import numpy as npdef PRint_arr(): da=np.zeros((2,2)) print(da) return 1

對應的cpp程序:

#include "Python.h"#include <iostream>using namespace std;int main(int argc, char* argv[]){ Py_Initialize(); if (!Py_IsInitialized()) { return -1; } PyObject *pModule = NULL; pModule = PyImport_ImportModule("hello"); //導入hello.py if (!pModule) { printf("not found .py file/n"); } PyObject *pFunc = NULL; PyObject *pValue = NULL; PyObject *pArgs=NULL;//方法一 //直接調用hello.py中的print_arr 其中"()"表示無參數 printf("方法一/n");pValue = PyObject_CallMethod(pModule, "print_arr", "()"); cout << PyLong_AsLong(pValue) << endl; //只能轉換一個數值(Py中的long轉成C++中的long),如果多于1個數值就會出錯//方法二 printf("方法二/n");pFunc = PyObject_GetAttrString(pModule, "print_arr"); //也可以使用該函數得到函數對象pValue = PyObject_CallFunction(pFunc, "()");cout << PyLong_AsLong(pValue) << endl;//方法三printf("方法三/n");pFunc = PyObject_GetAttrString(pModule, "print_arr"); pArgs=PyTuple_New(0);pValue = PyObject_CallObject(pFunc, pArgs);cout << PyLong_AsLong(pValue) << endl;Py_Finalize(); /* 結束Python解釋器,釋放資源 */system("pause"); return 0;}

運行結果: 這里寫圖片描述

結果證明,可行!

3、第二個程序(1個參數)

Python程序:

# hello.py# coding:utf-8import numpy as npdef change(data): da=np.array(data,dtype=float) print(da) return 10

cpp程序:

#include "Python.h"#include <iostream>using namespace std;int main(int argc, char* argv[]){ Py_Initialize(); if (!Py_IsInitialized()) { return -1; } PyObject *pModule = NULL; pModule = PyImport_ImportModule("hello"); //導入hello.py if (!pModule) { printf("not found .py file/n"); } PyObject *pFunc = NULL; PyObject *pValue = NULL; PyObject *pArgs=NULL;//方法一 //直接調用hello.py中的print_arr printf("方法一/n");pValue = PyObject_CallMethod(pModule, "change", "i",1); cout << PyLong_AsLong(pValue) << endl; //只能轉換一個數值(Py中的long轉成C++中的long),如果多于1個數值就會出錯//方法二 printf("方法二/n");pFunc = PyObject_GetAttrString(pModule, "change"); //也可以使用該函數得到函數對象pValue = PyObject_CallFunction(pFunc, "i",1);cout << PyLong_AsLong(pValue) << endl;//方法三printf("方法三/n");pFunc = PyObject_GetAttrString(pModule, "change"); pArgs=PyTuple_New(1);PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1)); pValue = PyObject_CallObject(pFunc, pArgs);cout << PyLong_AsLong(pValue) << endl;Py_Finalize(); /* 結束Python解釋器,釋放資源 */system("pause"); return 0;}

運行結果: 這里寫圖片描述

事實勝于雄辯!

3.1、傳一個數組做參數

cpp程序:

#include "Python.h"#include <iostream>using namespace std;int main(int argc, char* argv[]){ Py_Initialize(); if (!Py_IsInitialized()) { return -1; } PyObject *pModule = NULL; pModule = PyImport_ImportModule("hello"); //導入hello.py if (!pModule) { printf("not found .py file/n"); } PyObject *pFunc = NULL; PyObject *pValue = NULL; PyObject *pArgs=NULL;//方法一 //直接調用hello.py中的print_arr printf("方法一/n");pValue = PyObject_CallMethod(pModule, "change", "((ii))",1,2); cout << PyLong_AsLong(pValue) << endl; //只能轉換一個數值(Py中的long轉成C++中的long),如果多于1個數值就會出錯//方法二 printf("方法二/n");pFunc = PyObject_GetAttrString(pModule, "change"); //也可以使用該函數得到函數對象pValue = PyObject_CallFunction(pFunc, "[ii]",1,2);cout << PyLong_AsLong(pValue) << endl;//方法三printf("方法三/n");pFunc = PyObject_GetAttrString(pModule, "change"); pArgs=PyTuple_New(1);PyTuple_SetItem(pArgs, 0, Py_BuildValue("[iiii]", 1,2,3,4)); pValue = PyObject_CallObject(pFunc, pArgs);cout << PyLong_AsLong(pValue) << endl;Py_Finalize(); /* 結束Python解釋器,釋放資源 */system("pause"); return 0;}

運行結果: 這里寫圖片描述

3.2、傳一個數組做參數(數組長度很長) cpp程序:

#include "Python.h"#include <iostream>using namespace std;int main(int argc, char* argv[]){ Py_Initialize(); if (!Py_IsInitialized()) { return -1; } PyObject *pModule = NULL; pModule = PyImport_ImportModule("hello"); //導入hello.py if (!pModule) { printf("not found .py file/n"); } PyObject *pFunc = NULL; PyObject *pValue = NULL; PyObject *pArgs=NULL; PyObject *pList=NULL;/* //方法一 //直接調用hello.py中的print_arr 其中"()"表示無參數 printf("方法一/n");pValue = PyObject_CallMethod(pModule, "change", "((ii))",1,2); cout << PyLong_AsLong(pValue) << endl; //只能轉換一個數值(Py中的long轉成C++中的long),如果多于1個數值就會出錯*//*//方法二 printf("方法二/n");pFunc = PyObject_GetAttrString(pModule, "change"); //也可以使用該函數得到函數對象pValue = PyObject_CallFunction(pFunc, "[ii]",1,2);cout << PyLong_AsLong(pValue) << endl;*///方法三printf("方法三/n");pFunc = PyObject_GetAttrString(pModule, "change"); pArgs=PyTuple_New(1);pList=PyList_New(0);//一個空列表for(int i=0;i<10;i++){ PyList_Append(pList,Py_BuildValue("i",i)); // 使用append將值放入列表中}PyTuple_SetItem(pArgs,0,pList);//將列表pList作為參數賦給pArgs//PyTuple_SetItem(pArgs, 0, Py_BuildValue("[iiii]", 1,2,3,4)); pValue = PyObject_CallObject(pFunc, pArgs);cout << PyLong_AsLong(pValue) << endl;Py_Finalize(); /* 結束Python解釋器,釋放資源 */system("pause"); return 0;}

運行結果: 這里寫圖片描述

4、第3個程序(多個參數)

Python程序:

# hello.py# coding:utf-8import numpy as npdef change(data1,data2): # da=np.array(data,dtype=float) print(data1+data2) return (data1+data2)

cpp程序:

#include "Python.h"#include <iostream>using namespace std;int main(int argc, char* argv[]){ Py_Initialize(); if (!Py_IsInitialized()) { return -1; } PyObject *pModule = NULL; pModule = PyImport_ImportModule("hello"); //導入hello.py if (!pModule) { printf("not found .py file/n"); } PyObject *pFunc = NULL; PyObject *pValue = NULL; PyObject *pArgs=NULL; PyObject *pList=NULL;//方法一 //直接調用hello.py中的print_arr 其中"()"表示無參數 printf("方法一/n");pValue = PyObject_CallMethod(pModule, "change", "ii",1,2); cout << PyLong_AsLong(pValue) << endl; //只能轉換一個數值(Py中的long轉成C++中的long),如果多于1個數值就會出錯//方法二 printf("方法二/n");pFunc = PyObject_GetAttrString(pModule, "change"); //也可以使用該函數得到函數對象pValue = PyObject_CallFunction(pFunc, "(ii)",1,2);cout << PyLong_AsLong(pValue) << endl;//方法三printf("方法三/n");pFunc = PyObject_GetAttrString(pModule, "change"); pArgs=PyTuple_New(2);PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1)); PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 2));pValue = PyObject_CallObject(pFunc, pArgs);cout << PyLong_AsLong(pValue) << endl;Py_Finalize(); /* 結束Python解釋器,釋放資源 */system("pause"); return 0;}

運行結果: 這里寫圖片描述

5、總結

使用到的.py文件需放置在.exe 目錄下,否則會找不到文件PyLong_AsLong(pValue) 只能獲取到Python中傳遞的一個數值,如果是數組就會報錯,這個問題還沒找到合適的解決方法(如果有誰知道可以給我留言,在此感謝?。┱f明下一些字符代表的意義, s 代表字符串, i 代表整形變量, f 代表浮點數,o 代表一個python對象

Py_BuildValue的使用例子,來自python documentation: Py_BuildValue(“”) None Py_BuildValue(“i”, 123) 123 Py_BuildValue(“iii”, 123, 456, 789) (123, 456, 789) Py_BuildValue(“s”, “hello”) ‘hello’ Py_BuildValue(“ss”, “hello”, “world”) (‘hello’, ‘world’) Py_BuildValue(“s#”, “hello”, 4) ‘hell’ Py_BuildValue(“()”) () Py_BuildValue(“(i)”, 123) (123,) Py_BuildValue(“(ii)”, 123, 456) (123, 456) Py_BuildValue(“(i,i)”, 123, 456) (123, 456) Py_BuildValue(“[i,i]”, 123, 456) [123, 456] Py_BuildValue(“{s:i,s:i}”, “abc”, 123, “def”, 456) {‘abc’: 123, ‘def’: 456} Py_BuildValue(“((ii)(ii)) (ii)”, 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))

不知問什么使用debug模式總是出錯,使用Release模式就能運行,所有建議使用Release模式

如果Python是64位的,相應的VS要切換到x64

6、參考文獻

http://blog.csdn.net/chunleixiahe/article/details/50410208http://www.360doc.com/content/13/0812/11/9934052_306564761.shtmlhttp://blog.csdn.net/taiyang1987912/article/details/44779719http://blog.csdn.net/shenwansangz/article/details/44019433http://blog.csdn.net/shenwansangz/article/details/50055107https://docs.python.org/3.5/extending/index.html#extending-indexhttp://blog.csdn.net/chunleixiahe/article/details/50410553

暫時先寫這么多,以后還會不定期更新!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲aa在线观看| 91天堂在线观看| 日韩国产精品亚洲а∨天堂免| 亚洲视频免费一区| 国产精品电影在线观看| 国产精品夫妻激情| 国产精品美女呻吟| 亚洲free性xxxx护士白浆| 精品久久久久久久中文字幕| 91po在线观看91精品国产性色| 欧美激情综合色综合啪啪五月| 亚洲深夜福利网站| 亚洲一区二区久久| 黄色成人在线免费| 51色欧美片视频在线观看| 亚洲自拍偷拍一区| 亚洲第一综合天堂另类专| 欧美国产日韩一区| 久久全球大尺度高清视频| 久久伊人精品视频| 欧日韩在线观看| 日韩成人av在线播放| 免费91麻豆精品国产自产在线观看| 亚洲人成在线电影| 国产在线一区二区三区| 欧美日韩另类字幕中文| 久久69精品久久久久久国产越南| 欧美午夜精品久久久久久久| 欧美极品在线播放| 777777777亚洲妇女| 亚洲黄页视频免费观看| 日韩欧美在线观看| 亚洲精品中文字幕女同| 国产精品美女久久久免费| 国产午夜精品全部视频在线播放| 福利微拍一区二区| 国产日本欧美一区二区三区在线| 欧美一区二区视频97| 91精品美女在线| 久久成人18免费网站| 国产精品手机播放| 中文字幕在线观看日韩| 亚洲欧美精品中文字幕在线| 日韩精品视频中文在线观看| 日韩视频在线免费观看| 久久国产精品久久久| 国产女精品视频网站免费| 日韩视频免费中文字幕| 夜夜嗨av色一区二区不卡| 亚洲人高潮女人毛茸茸| 日韩福利伦理影院免费| 精品久久久久久中文字幕大豆网| 国产精品v片在线观看不卡| 久久免费国产视频| 高跟丝袜一区二区三区| 欧美性感美女h网站在线观看免费| 日本高清不卡的在线| 国产精品精品视频一区二区三区| 69影院欧美专区视频| 国产精品一区二区三区成人| 青青精品视频播放| 91免费高清视频| 国产女人18毛片水18精品| 久久亚洲精品小早川怜子66| 亚洲欧美另类人妖| 成人444kkkk在线观看| 亚洲欧美激情另类校园| 亚洲第一区中文字幕| 97精品视频在线播放| 精品女厕一区二区三区| 国产精品入口尤物| 国产成人激情小视频| 日韩一区av在线| 欧美精品videosex性欧美| 亚洲色图欧美制服丝袜另类第一页| 美日韩在线视频| 久久精品国产96久久久香蕉| 日韩av在线电影网| 久久777国产线看观看精品| 国内外成人免费激情在线视频| 国产精品狼人色视频一区| 大伊人狠狠躁夜夜躁av一区| 欧美日韩国产一区中文午夜| 97色在线视频观看| 日韩精品在线免费观看| 欧美黑人巨大精品一区二区| 成人黄在线观看| 国产精品无av码在线观看| 亚洲老板91色精品久久| 欧美激情综合色| 欧美激情区在线播放| 欧美一级淫片aaaaaaa视频| 国产亚洲精品美女久久久久| 日本久久久久亚洲中字幕| 91亚洲精品在线观看| 亚洲丝袜一区在线| 久久69精品久久久久久久电影好| 91精品国产乱码久久久久久久久| 国产精品福利观看| 精品国产一区av| 91精品视频大全| 日本欧美在线视频| 91成人精品网站| 欧美日韩免费观看中文| 久久亚洲精品中文字幕冲田杏梨| 成人网中文字幕| 亚洲www在线| 蜜臀久久99精品久久久久久宅男| 成人性教育视频在线观看| 国产精品偷伦视频免费观看国产| 欧美激情亚洲一区| 久久久亚洲精品视频| 91系列在线观看| 日本国产一区二区三区| 国产mv久久久| 色久欧美在线视频观看| 欧美最近摘花xxxx摘花| 亚洲第一视频网| 久久精品国产99国产精品澳门| 亚洲成年人在线| 97国产精品视频| 欧美在线免费观看| 最近2019中文字幕第三页视频| 国产精品久久久久免费a∨| 国产成人综合一区二区三区| 最近2019中文字幕第三页视频| 欧美中在线观看| 亚洲**2019国产| 国产一区二区三区久久精品| 色噜噜狠狠狠综合曰曰曰| 欧美日韩在线视频观看| 国产极品精品在线观看| 亚洲高清久久久久久| 亚洲国产精品va在线看黑人| 亚洲美女精品成人在线视频| 日韩av在线免费播放| 日韩亚洲欧美中文在线| 欧美高清在线视频观看不卡| 国产精品美女久久久久久免费| 亚洲综合一区二区不卡| 国产精品麻豆va在线播放| 法国裸体一区二区| 欧美激情国产精品| 亚洲国产精品久久久久秋霞蜜臀| 国产精品7m视频| 综合久久五月天| 欧美激情一区二区三级高清视频| 亚洲第一在线视频| 日韩hd视频在线观看| 欧亚精品在线观看| 欧美精品在线免费观看| 亚洲丝袜一区在线| 午夜欧美不卡精品aaaaa| 91精品国产色综合| 国产精品免费看久久久香蕉| 91国产美女在线观看| 久久久久久亚洲精品中文字幕| 久久理论片午夜琪琪电影网| 精品国产欧美一区二区五十路| 日韩小视频网址| 2018国产精品视频| 欧美成人在线免费视频| 成人免费淫片aa视频免费| 亚洲午夜国产成人av电影男同|