2011-03-14 16 views
5

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.

+0

¿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

+0

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

+0

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

Respuesta

3

creo que lo que quiere es la siguiente:

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() es necesario, el try { ... } catch() { ... } -bloque produce un mensaje de error de Python como el que se podrían obtener de la intérprete y bp::import sólo funciona para los módulos, no se para los atributos de los módulos importados :-)

+0

Gracias, ya he atrapado eso. Es extraño que la línea esté en los documentos de impulso oficiales. – Ockonal

Cuestiones relacionadas