2.
3.通過c++呼叫python指令碼,主要利用python提供的api,實際上,c++主要呼叫的是python的直譯器,而python的直譯器本質就是實現在動態鏈結庫裡的,因此在呼叫前後要進行一些初始化和資源釋放的工作,另外,要呼叫python指令碼裡的函式等等,需要使用python提供的一些特殊的api來包裝c++呼叫。
(1) 初始化python直譯器,若初始化失敗,繼續呼叫會出現各種錯誤
void py_initialize(void)
(2) 檢查python直譯器是否初始化,返回0表示沒有經過初始化
int py_isinitialized(void)
(3) 反初始化直譯器,包括子直譯器,同時釋放python直譯器占用的資源
void py_finalize()
(4) 實際上是乙個巨集,執行python**
int pyrun_******string(const
char *command)
(5) 匯入乙個模組,name是python檔案的檔名,不帶.py,類似於python內建的import
pyobject* pyimport_importmodule(char *name)
(6) 相當於python模組物件的dict屬性,得到模組命名空間下的字典物件
pyobject* pymodule_getdict( pyobject *module)
(7) 執行一段python**
pyobject* pyrun_string(const
char* str, int start,pyobject* globals, pyobject* locals)
(8) 把python資料型別轉換為c的型別
int pyarg_parse(pyobject* args, char* format, ...)
(9) 返回模組物件o的attr_name屬性或函式,相當於python中的表示式o.attr_name
pyobject* pyobject_getattrstring(pyobject *o, char*attr_name)
(10) 構建乙個引數列表,將c型別轉換為python物件
pyobject* py_buildvalue(char* format, ...)
(11) 呼叫python函式,兩個引數都是python物件指標,pfunc是要呼叫的python函式,一般來說,可以用過pyobject_getattrstring()獲得,pargs是函式的引數列表,通常是py_buildvalue()來構建的
pyobject* pyeval_callobject(pyobject* pfunc, pyobject*pargs)
編譯若出現unresolved external symbol _py_initialize referenced in function "void __cdecl test(void)" (?test@@yaxxz)
等錯誤,可能是工程的platform和python有著不同bit,將工程轉換為32位或者64位與python一致即可
python的c模組不支援debug模式,所以debug下編譯會出現找不到pythonxx_d.lib的錯誤,需要修改python標頭檔案pyconfig.h的配置,將debug庫檔案換成pythonxx.lib即可
即將
# ifdef _debug
# pragma comment(lib,"python27_d.lib")
# else
# pragma comment(lib,"python27.lib")
修改為:
# ifdef _debug
# pragma comment(lib,"python27.lib")
# else
# pragma comment(lib,"python27.lib")
**示例:
#include
#pragma comment(lib,"python27.lib")
using namespace std;
void getcurrent()
void test()
void test2()
void test3()
getcurrent();
char *name = null;
int age = 0;
pyobject *pmodule = null;
pyobject *pdict = null;
pyobject *pclass = null;
pyobject *pinstance = null;
pyobject *presult = null;
pyobject *obj_content = null;
pyobject *obj_flag = null;
pmodule = pyimport_importmodule("pytest");//引用模組
pdict = pymodule_getdict(pmodule);//獲取模組字典屬性
pclass = pydict_getitemstring(pdict,"pytest");//通過字典屬性獲取模組中的類
pinstance = pyinstance_new(pclass,null,null);//例項化獲取的類
//呼叫類方法fun,並傳入兩個引數,注意引數型別,並獲取返回值
presult = pyobject_callmethod(pinstance,"fun","(s,i)","sherlock",100);
obj_content = pydict_getitemstring(presult,"name");/取出返回值key為name的value
name = pystring_asstring(obj_content);//將型別轉換為c/c++型別
obj_flag = pydict_getitemstring(presult,"age");
age = pyint_aslong(obj_flag);
cout
python呼叫c的方法
python呼叫c的方法研究了三天,今天看了一篇部落格 原來這麼簡單,可能是最簡單的方法了吧。下面整理一下思路 實驗平台 window xp系統,編譯環境是vs2005 實驗步驟 步驟1 在vs2005下編寫c模組 如下 include include include include python....
在C 中呼叫python方法
1.安裝ironpython 2.建立專案 建立乙個c 的控制台應用程式。新增引用 瀏覽到ironpython的安裝目錄中,新增對ironpython.dll,microsoft.scripting.dll 兩個dll的引用。3.新增python檔案到當前的專案中 def welcome name ...
C 呼叫方法
本小節我們學習兩個簡單的呼叫方法 c 呼叫方法 遞迴方法呼叫,下面我們用 段來實現這兩種呼叫方法。1.本方法解析,讓使用者通過控制台輸入三個浮點型變數,返回給使用者最小值。例項 class comparesize public double findsize 為獲取的資料佔位 public void...