2011-09-02 14 views
6

Estoy teniendo problemas con el Python incrustado para C según el Documentation - Siempre que intente utilizar módulos importados consigo un:Empotrado de Python en C - módulos de importación

excepción no controlada en 0x1e089e85 en PythonIncl.exe: 0xC0000005: Ubicación de lectura de violación de acceso 0x00000004.

El error se produce en el método PyObject_GetAttrString() y la documentación no es de mucha ayuda. También intenté utilizar tutoriales como en un Example de IBM, pero siempre recibo la misma infracción de acceso.

El siguiente es el código de ejemplo de uno de los tutoriales que parece que no puedo poner en práctica, ¿qué hay de malo aquí?

C-código (en un archivo principal):

#include <Python.h> 
int main() 
{ 
    PyObject *strret, *mymod, *strfunc, *strargs; 
    char *cstrret; 
    Py_Initialize(); 
    mymod = PyImport_ImportModule("reverse"); 
    strfunc = PyObject_GetAttrString(mymod, "rstring"); 
    strargs = Py_BuildValue("(s)", "Hello World"); 
    strret = PyEval_CallObject(strfunc, strargs); 
    PyArg_Parse(strret, "s", &cstrret); 
    printf("Reversed string: %s\n", cstrret); 
    Py_Finalize(); 
    return 0; 
} 

código Python (en un archivo llamado reverse.py, misma carpeta):

def rstring(s): 
    i = len(s)-1 
    t = '' 
    while(i > -1): 
     t += s[i] 
     i -= 1 
    return t 

Me postulo una máquina XP utilizando MSVS2008, Python 2.7

Un poco de contexto: estoy tratando de incrustar un pequeño script python, que usa OpenOPC, en un programa C bastante grande y me gustaría transferir datos entre los dos. Sin embargo, ya fallo en una prueba de concepto con ejemplos básicos.

+2

¿Sabes que debes sangrar el cuerpo de una pitón mientras está? – Griwes

+1

Casi siempre es mejor y más potente escribir una extensión para Python en lugar de incrustar Python. Hacerlo parece bastante similar, pero hay mejores herramientas para extender y es más fácil acceder a otras herramientas de Python cuando sea necesario. Consulte http://twistedmatrix.com/users/glyph/rant/extendit.html para obtener una perspectiva de la extensión frente a la incorporación. –

+0

sí, sobre la sangría faltante, que acaba de perderse durante la publicación, está allí en el IDE. – Shorkaa

Respuesta

14

Compruebe el resultado de la llamada PyImport_ImportModule: falla y devuelve NULL. Esto se debe a que, por defecto, el directorio actual no se encuentra en la ruta de búsqueda. Agregue

PySys_SetPath("."); // before .. 
mymod = PyImport_ImportModule("reverse"); 

para agregar el directorio actual a la ruta de búsqueda del módulo y hacer que su ejemplo funcione.

+0

'PySys_SetPath (". ")' Borra/sobrescribe la ruta de búsqueda. Será mejor que [adjunte] (http://stackoverflow.com/a/8859538/6394138) a él. – Leon

2

Está procediendo sin buscar errores, por lo que no es sorprendente que su código falle de esta manera. A partir de su descripción, parece que mymod es NULL, lo que sería coherente con una importación fallida. Una posible causa de la importación fallida es que el reverse.py que ha publicado tiene un error de sintaxis.

Cuestiones relacionadas