在 C 中使用 Python script

2021-05-28 10:17:53 字數 2787 閱讀 3115

想要在c++ 中嵌入script **, 除了自己寫指令碼引擎外, lua, python 都可以在c++ 中使用, 另外 monobind, angelscript library 都是一些c++ script library, 可以嵌入到c++ 中使用 .

今天在c++ 中試著嵌入 python ** (示例**在 python-2.5.2\demo\embed\ 下)

#include 

<

python.h

>

intmain(

intargc, 

char

*argv)

在執行時可能會產生類似'import site' failed; use -v for traceback的錯誤, 原因是python 在import module 的時候的路徑問題. 有3種方法可以解決(以前通過設定環境變數 pythonpath 好像在2.5 已經無效了).

0. 取消注釋 py_nositeflag = 1;

這個只是取消import site , 當然如果在**中要import 啥的話, 還是會出現錯誤的.

a. 設定環境變數 pythonhome = d:\usr\python 

b. 在呼叫 py_initialize 之前呼叫函式

py_setpythonhome("d:\\usr\\python");  // 引數是python 的安裝目錄

2. 其他一些有用的資源

c++擴充套件和嵌入python應用 (介紹了一些python/c api 函式, 以及ext 例子, 一般般)

3. python 多執行緒的使用

zz 今天看了近一天關於多執行緒的應用中,如何安全呼叫python方面的資料,開始的時候看的簡直頭大如斗,被python語言的全域性鎖(global interpreter lock)、執行緒狀態(thread state )等都有點繞暈了,後來經過各方面文章和幫助文件的相互參考,發現對於2.4/2.5版本,提供了pygilstate_ensure, pygilstate_release,哎,這下可方便大發了。

一、首先定義乙個封裝類,主要是保證pygilstate_ensure, pygilstate_release配對使用,而且這個類是可以巢狀使用的。

#include

class pythreadstatelock

~pythreadstatelock(void)

private:

pygilstate_state state;

};二、在主線程中,這樣處理

// 初始化

py_initialize();

// 初始化執行緒支援

pyeval_initthreads();

// 啟動子執行緒前執行,為了釋放pyeval_initthreads獲得的全域性鎖,否則子執行緒可能無法獲取到全域性鎖。

pyeval_releasethread(pythreadstate_get());

// 其他的處理,如啟動子執行緒等

......

// 保證子執行緒呼叫都結束後

pygilstate_ensure();

py_finalize();

// 之後不能再呼叫任何python的api

三、在主線程,或者子執行緒中,呼叫python本身函式的都採用如下處理

呵呵,看這樣是否非常簡單了。

另外還有兩個和全域性鎖有關的巨集,py_begin_allow_threads 和 py_end_allow_threads。這兩個巨集是為了在較長時間的c函式呼叫前,臨時釋放全域性鎖,完成後重新獲取全域性鎖,以避免阻塞其他python的執行緒繼續執行。這兩個巨集可以這樣呼叫

4. 可能的錯誤及解決

a. 在vs 200x 下 debug 模式出現鏈結問題

extmodule.obj : error lnk2019: unresolved external symbol __imp___py_dealloc referenced in function _pyswigobject_format

extmodule.obj : error lnk2019: unresolved external symbol __imp___py_negativerefcount referenced in function _pyswigobject_format

extmodule.obj : error lnk2001: unresolved external symbol __imp___py_reftotal

extmodule.obj : error lnk2019: unresolved external symbol __imp___pyobject_debugfree referenced in function _pyswigobject_dealloc

extmodule.obj : error lnk2019: unresolved external symbol __imp___pyobject_debugmalloc referenced in function _pyswigobject_new

extmodule.obj : error lnk2019: unresolved external symbol __imp__py_initmodule4tracerefs referenced in function _init_extmodule

主要是因為 py_debug/py_trace_refs 引起, 修改 python\include 下的 pyconfig.h, object.h 兩個檔案就行了 ... 詳見

from: 

在C 中使用Queue

介紹 queue類執行將放在在queue中的物件採用先進先出的資料結構。物件從一端插入到佇列中從另一端移除。物件的順序程序使用queue queue介面 queue類實現了三個主要集合介面 icollection ienumerable和icloneable。queue的重要方法 queue類常用的...

在 C 中使用畫筆

出處 在 c 中使用畫筆 public class rectangle shape protected point m start protected point m end public rectangle point start,point end,color fgcolor m start s...

在C 中使用SendMessage

在c 中使用sendmessage 日期 2005 02 04 備註 主要描述在呼叫api函式sendmessage時資料型別的轉換。sendmessage是乙個在user32.dll中宣告的api函式,在c 中匯入如下 using system.runtime.interopservices dl...