2009-06-02 17 views
10

Estoy usando boost :: python para insertar un código python en una aplicación. Pude obtener declaraciones de impresión u otras expresiones para que se evalúen correctamente, pero cuando intento importar módulos, no se está importando y la aplicación está saliendo. Además, la llamada de función globals() en el código incrustado también da un error de tiempo de ejecución.¿Cómo importo módulos en boost :: python embedded python code?

#include <boost/python.hpp> 

using namespace boost; 
using namespace boost::python; 
using namespace boost::python::api; 

int main(void) { 
    Py_Initialize(); 
    object main_module = import("__main__"); 
    object main_namespace = main_module.attr("__dict__"); 
    main_namespace["urllib2"] = import("urllib2"); 

    object ignored = exec(
      "print 'time'\n", main_namespace); 
} 

aquí, he intentado importar urllib2 usando la función de importación alza, ésta se compila y se ejecuta correctamente, pero con la siguiente declaración ejecutivo, da un error.

object ignored = exec(
      "print urllib2\n" 
      "print 'time'\n", main_namespace); 

O cuando quito la función de refuerzo de importación y hago la importación desde dentro del código incrustado también, se da un error. Intenté usar una prueba: excepto: bloque, pero eso tampoco funciona. ¿Esto se debe a que la aplicación C++ no puede encontrar la ubicación del módulo urllib2 py algo así? ¿Hay alguna manera de establecer la ruta del módulo antes de intentar importar?

Esto se está construyendo solo para uso interno, por lo que es posible codificar algunos de los caminos.

Editar: Más información:
Esto es lo que sucede. Intenté ... atrapar y llamé a PyErr_Print() cuando haya una excepción, y obtuve esto como un error todo el tiempo cuando hay importaciones de módulos o incluso llamadas a funciones. Mensaje de error:

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
TypeError: 'NoneType' object does not support item assignment 

¿Alguien puede pensar en alguna razón?

Respuesta

3

Eso no ayudó, pero encontré una solución diferente a mi problema. Mi código actual es el siguiente:

#include <boost/python.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost; 
using namespace boost::python; 
using namespace boost::python::api; 

int main(void) { 
     Py_Initialize(); 
     boost::python::object http = boost::python::import("urllib2"); 

     try 
     { 
       boost::python::object response = http.attr("urlopen")("http://www.google.com"); 
       boost::python::object read = response.attr("read")(); 
       std::string strResponse = boost::python::extract<string>(read); 
       cout << strResponse << endl; 
     } 
     catch(...) 
     { 
       PyErr_Print(); 
       PyErr_Clear(); 
     } 
} 

De todas formas, gracias por la respuesta Jonas

+0

Me alegro de que tenga su código de trabajo. Que quieres hacer con eso? –

+0

Oh. Estaba totalmente harto de las bibliotecas de sockets C++. Necesitan tiempo para comprender y, dado que no soy un estudiante de informática, tardo más en comprender. Así que creé algo que se siente como un urllib ++ asíncrono con el python urllib2 en la parte posterior. : D Sé que suena loco. ¡Pero ahora tengo una solución extremadamente conveniente! – Sahas

+0

Jeje, ¡bien por ti! –

4

Si no lo ha hecho, es necesario que

 
import sys 
sys.path.append("/home/user/whatever") 

Eso se hizo cargo de mis problemas hace un par de años, cuando la incrustación de impulso :: pitón (Python v2.5).

Edit:

Poked around in old code. Tal vez esto hace el truco:

 
Py_SetProgramName(argv[0]); 
Py_InitializeEx(0); 

Sonidos seguro de que realmente debería ser necesario el Py_SetProgramName(), pero débilmente recordar algunos negocios a pescado allí.

+0

Gracias por la respuesta, y realmente por el retraso en probarlo y decirte, Jonas. Lo intenté pero esto no estaba ayudando. Ni siquiera puedo ejecutar el programa si tiene esta sola declaración "print globals() \ n". Probé el mismo código en Windows y Linux, y la misma respuesta en todas partes. Estoy usando Boost 1.39.0 – Sahas

+0

Vaya. No había notado la edición. Voy a intentar eso también. – Sahas

+1

Estaba teniendo un error de segmentación misterioso al importar ciertas bibliotecas (como gzip o numpy). Entonces este corte resuelve el problema como un encanto: 'Py_SetProgramName ("");' ' Py_InitializeEx (0);' Gracias @Jonas –

0

me encontré con el mismo problema que tú, AIE ejemplo muy sencillo que resulta en la TypeError, y encontró la respuesta en this question, que fue para proporcionar el espacio de nombres dos veces, tanto como global y local.

Cuestiones relacionadas