2012-04-23 62 views
2

我目前正試圖將python解釋器嵌入到我的應用程序中。因爲我的應用程序使用Poco API進行日誌記錄,所以我想通過Python中的日誌記錄模塊使其可訪問。 我這樣做的最簡單的方法是提供一組靜態功能作爲擴展模塊來記錄消息,然後編寫一個調用這些函數的Handler子類。Python/C-Api:將模塊添加到模塊

由於我不想讓用戶安裝任何額外的Python模塊,並且因爲我沒有要求在我的嵌入式Python解釋器之外重新使用我的代碼,所以如果可以通過Py_InitModule()提供靜態函數然後將硬編碼的Handler子類添加到創建的模塊中(硬編碼意味着:在運行時添加,但實際上是一個在初始化時始終解釋的常量字符串)。

我的問題是,我不知道如何解釋一個正常的Python類的定義,如:

class Test: 
    someVar=1 

,這樣它被添加到一個給定的模塊,然後accesable作爲,如mymodule.Test

一解決方案可以是純粹的基於python或使用python c-api。

+0

你需要幫助創建類或將其添加到模塊? – 2012-04-25 02:42:47

+0

@ IgnacioVazquez-Abrams將它添加到模塊中 – Paranaix 2012-04-25 11:43:43

回答

1

我終於找到了的answere自己: 實際上有2種方法中的模塊的上下文中執行的代碼

方式1

PyObject* module = Py_InitModule("poco",LoggingPocoMethods); 
PyObject* code = Py_CompileString("class Test:\n\tdef __repr__(self):\n\t\treturn 'Hello world'","",Py_file_input); 
PyImport_ExecCodeModule("poco",code); 

該方法具有的缺點是,該模塊將被重新加載,這在現階段是不需要的。

路2

PyObject* module = Py_InitModule("poco",LoggingPocoMethods); 
PyObject* mainModule = PyImport_AddModule("__main__"); 

PyObject* dict = PyModule_GetDict(module); 
PyObject* mainDict = PyModule_GetDict(mainModule); 

PyRun_String("def test():\n\tprint 'test'\n",Py_file_input,mainDict,dict); 
0

把東西放入模塊中,只需指定它。假設類Test如上所述,要將其附加到該名稱下的模塊mymodule,只需編寫

mymodule.Test = Test 

就是這樣。

+0

雖然這在所需模塊導入時起作用,但只有在調用了'Py_InitModule()'時才起作用。 – Paranaix 2012-04-25 11:54:35