【发布时间】:2011-03-14 17:23:35
【问题描述】:
我正在使用 boost.python 构建应用程序。我有一些名为ScriptsManager 的单例类,它具有initPython 的功能:
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, mMainNamespace 都是 boost::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
当我在bp::import 之前调用Py_Initialize() 时,我得到:
在抛出一个之后调用终止 的实例 'boost::python::error_already_set'
UPD2
似乎问题出在代码中:
mMainNamespace = bp::import("__dict__");
结果代码为:
Py_Initialize();
mMainModule = bp::import("__main__");
mMainNamespace = mMainModule.attr("__dict__");
我不确定它是否正确。
UPD3
是的,2-nd 更新有效。好奇怪,mMainNamespace = bp::import("__dict__") 是写在官方 boost 文档中的。
【问题讨论】:
-
您能否澄清一下:您是嵌入 boost python,还是从用 c++ 编写的 python 加载模块?或者,两者的某种组合......
-
我两者都需要。第一个是使用 c++ 中的 boost.python lib 初始化 python,然后做我想做的一切(也运行我自己的模块)。
-
所以这个段错误发生在嵌入 python 的 c++ 主机进程上,然后将(相同或不同?)代码作为模块加载?
-
@autopulated 现在我的 c++ 应用程序只执行我在这篇文章中注意到的代码。忘记自己的模块。我无法从 c++ 运行 python 代码。
-
好的,这只是简单的嵌入。我不知道问题是什么,但是您的代码似乎与嵌入 boost python 的示例无关:(例如wiki.python.org/moin/boost.python/EmbeddingPython 或members.gamedev.net/sicrane/articles/EmbeddingPythonPart1.html)
标签: c++ python boost initialization segmentation-fault