C 呼叫Python方法

2021-07-25 12:37:23 字數 3332 閱讀 2001

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...