2011-03-14 173 views
5

我正在用boost.python構建應用程序。我有一些單獨的類名爲ScriptsManager,它具有功能initPython其作用:Python初始化段錯誤

mMainModule = bp::import("__main__"); 
mMainNamespace = bp::import("__dict__"); 

bp::object ignored = bp::exec("hello = file('hello.txt', 'w')\n" 
        "hello.write('Hello world!')\n" 
        "hello.close()", mMainNamespace); 

兩個mMainModule, mMainNamespaceboost::python::object

所以,當我啓動應用程序時,我得到:

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000000000 in ??() 
(gdb) bt 
#0 0x0000000000000000 in ??() 
#1 0x00007ffff5d5efd9 in PyEval_GetGlobals() from /usr/lib/libpython2.7.so.1.0 
#2 0x00007ffff5d79113 in PyImport_Import() from /usr/lib/libpython2.7.so.1.0 
#3 0x00007ffff5d7935c in PyImport_ImportModule() from /usr/lib/libpython2.7.so.1.0 
#4 0x00007ffff5a6d8bd in boost::python::import(boost::python::str)() from /usr/lib/libboost_python.so.1.46.0 
#5 0x0000000000510b1b in ScriptsManager::initPython (this=0x7b6850) at /home/ockonal/Workspace/Themisto/src/Core/ScriptsManager.cpp:24 
#6 0x0000000000547650 in Application::main (args=...) at /home/ockonal/Workspace/Themisto/src/main.cpp:60 
#7 0x00007ffff4ebbf86 in main() from /usr/lib/libclan22App-2.2.so.1 
#8 0x00007ffff24c4dcd in __libc_start_main() from /lib/libc.so.6 
#9 0x00000000004c9769 in _start() 

出了什麼問題嗎?


UPD1

當我打電話Py_Initialize()以前bp::import我得到:

扔 '的boost ::蟒蛇:: error_already_set'

的 實例後終止叫

UPD2

看來,問題是代碼:

mMainNamespace = bp::import("__dict__"); 

結果代碼:

Py_Initialize(); 
mMainModule = bp::import("__main__"); 
mMainNamespace = mMainModule.attr("__dict__"); 

我不知道它是正確的。


UPD3

沒錯, -nd更新工作。奇怪的是,mMainNamespace = bp::import("__dict__")是用官方的助推文檔編寫的。

+0

你能說清楚:你是嵌入boost python,還是從python中加載模塊用C++編寫?或者,兩者的一些組合...... – James 2011-03-14 17:42:19

+0

我需要兩者。首先是使用C++中的boost.python lib來啓動python,然後完成我想要的任何事情(也運行我自己的模塊)。 – Ockonal 2011-03-14 17:45:14

+0

所以這段錯誤發生在一個C++宿主進程中,它嵌入了python,然後將(相同或不同的?)代碼作爲模塊加載? – James 2011-03-14 17:50:39

回答

3

我想你想要的是以下幾點:

int main (int argc, char** argv) 
{ 
    try 
    { 
     // If you're going to use threads: PyEval_InitThreads(); 
     Py_Initialize(); 
     PySys_SetArgv(argc, argv); 

     bp::object mMainModule = bp::import('__main__'); 
     bp::object mMainNamespace = mMainModule.attr('__dict__'); 

     bp::object ignored = bp::exec("hello = file('hello.txt', 'w')\n" 
       "hello.write('Hello world!')\n" 
       "hello.close()", mMainNamespace); 
    } 
    catch (bp::error_already_set const&) 
    { 
     PyErr_Print(); 
    } 
} 

Py_Initialize()是必要的,try { ... } catch() { ... } - 阻塞產生一樣,你會從解釋獲取和bp::import僅適用於模塊,而不是一個Python的錯誤信息對於進口模塊的屬性:-)

+0

謝謝,我已經抓住了。奇怪的是,這條線在官方的增強文檔中。 – Ockonal 2011-03-14 18:06:27