Estoy compilando la aplicación con boost.python. Tengo alguna clase Singleton nombrado ScriptsManager
, que tiene la función initPython
lo que hace:Inicialización de Python segfault
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);
tanto mMainModule, mMainNamespace
son boost::python::object
.
Así, cuando inicio la aplicación, me sale:
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()
Qué podría estar mal aquí?
UPD1
Cuando llamo Py_Initialize()
antes bp::import
me sale:
por terminado llama después de lanzar una instancia de 'impulso :: :: pitón error_already_set'
UPD2
Parece que era un problema en el código:
mMainNamespace = bp::import("__dict__");
El código de resultado es:
Py_Initialize();
mMainModule = bp::import("__main__");
mMainNamespace = mMainModule.attr("__dict__");
no estoy seguro de que sea correcto.
UPD3
Sí, actualización -nd funciona. Tan extraño, mMainNamespace = bp::import("__dict__")
está escrito en los documentos de impulso oficiales.
¿Puedes aclarar: estás integrando boost python, o cargando un módulo de python escrito en C++? O bien, una combinación de ambos .... – James
Necesito ambos. El primero es iniciar python usando boost.python lib desde C++ y luego hacer todo lo que quiero (también ejecuto mis propios módulos). – Ockonal
Entonces, este segfault está sucediendo en un proceso de host C++ que está incorporando python que luego carga el código (¿igual o diferente?) Como un módulo. – James