2012-03-21 5 views
8

Sto incorporando Python in un'applicazione C/C++ che avrà un'API definita.Embedded Python 2.7.2 Importazione di un modulo da una directory definita dall'utente

L'applicazione ha bisogno di istanziare le classi definite in uno script, che sono strutturati o meno così:

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

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

Sono riuscito in passato (per il proof-of-concept) per ottenere questo fatto utilizzando il seguente tipo di codice:

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); 

Ora che sono in più di un ambiente di produzione, questo sta venendo a mancare alla linea PyImport_Import - Penso che questo potrebbe essere dovuto al fatto che sto cercando di anteporre una directory allo script nome, es

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

Ora, per dare un'idea di quello che ho provato, ho cercato di modificare il percorso di sistema prima che tutte queste chiamate per renderlo search per questo modulo. In sostanza ha cercato di modificare a livello di codice sys.path:

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

Queste linee correre ok, ma non hanno alcun effetto sul fare il mio lavoro codice. Ovviamente, il mio vero codice ha un carico di errori di controllo che ho escluso quindi non preoccuparti di quello!

Quindi la mia domanda: come faccio a indirizzare l'interprete incorporato ai miei script in modo appropriato in modo da poter istanziare le classi?

risposta

16

è necessario specificare userscript e non userscript.py utilizzare anche PyImport_ImportModule prende direttamente un char *

userscript.py significa modulo py nel pacchetto userscript

questo codice funziona per me:

#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

Molte grazie - questo mi ha fatto attraversare il muro! Ora per capire cosa c'è di sbagliato nello script di test che sto chiamando! – Fritz

+0

In Python 3, PyString_FromString è sparito. Utilizzare invece PyBytes_FromString. – edj

Problemi correlati