2012-03-21 11 views
8

Estoy integrando Python en una aplicación C/C++ que tendrá una API definida.Embedded Python 2.7.2 Importación de un módulo desde un directorio definido por el usuario

la aplicación necesita para crear instancias de clases definidas en un guión, que se estructuran más o menos así:

class userscript1: 
    def __init__(self): 
     ##do something here... 

    def method1(self): 
     ## method that can be called by the C/C++ app...etc 

que he logrado en el pasado (para la prueba de concepto) para hacer esto utilizando el siguiente tipo de código:

PyObject* pName = PyString_FromString("userscript.py"); 
PyObject* pModule = PyImport_Import(pName); 
PyObject* pDict = PyModule_GetDict(pModule); 
PyObject* pClass = PyDict_GetItemString(pDict, "userscript"); 
PyObject* scriptHandle = PyObject_CallObject(pClass, NULL); 

Ahora que estoy en más de un entorno de producción, esto está fallando en la línea de PyImport_Import - Creo que esto podría ser debido a que estoy tratando de anteponer un directorio a la secuencia de comandos nombre, por ejemplo

PyObject* pName = PyString_FromString("E:\\scriptlocation\\userscript.py"); 

Ahora, para darle una idea de lo que he intentado, he intentado modificar la ruta del sistema antes de todas estas llamadas para hacer que la búsqueda de este módulo. Básicamente intentaron modificar sys.path programación:

PyObject* sysPath = PySys_GetObject("path"); 
PyObject* path = PyString_FromString(scriptDirectoryName); 
int result = PyList_Insert(sysPath, 0, path); 

Estas líneas funcionar bien, pero no tienen efecto en hacer mi trabajo código. Obviamente, mi código real tiene un montón de errores que he excluido, ¡así que no te preocupes por eso!

Así que mi pregunta: ¿cómo dirijo el intérprete incrustado a mis secuencias de comandos de manera adecuada para que pueda instanciar las clases?

Respuesta

16

es necesario que especifique userscript y no userscript.py también utilizan PyImport_ImportModule que lleva directamente un char *

userscript.py significa módulo de py en el paquete userscript

este código funciona para mí:

#include <stdio.h> 
#include <stdlib.h> 
#include <Python.h> 

int main(void) 
{ 
    const char *scriptDirectoryName = "/tmp"; 
    Py_Initialize(); 
    PyObject *sysPath = PySys_GetObject("path"); 
    PyObject *path = PyString_FromString(scriptDirectoryName); 
    int result = PyList_Insert(sysPath, 0, path); 
    PyObject *pModule = PyImport_ImportModule("userscript"); 
    if (PyErr_Occurred()) 
     PyErr_Print(); 
    printf("%p\n", pModule); 
    Py_Finalize(); 
    return 0; 
} 
+1

Muchas gracias - ¡Esto me ayudó a atravesar la pared! ¡Ahora para descubrir qué está mal con el script de prueba que estoy llamando! – Fritz

+0

En Python 3, PyString_FromString se ha ido. Use PyBytes_FromString en su lugar. – edj

Cuestiones relacionadas