2011-08-12 3 views

Répondre

0

D'accord, ça va être un peu plus long. Notez que j'ignore à peu près toutes les vérifications d'erreurs "habituelles" - à peu près n'importe quelle méthode python peut renvoyer NULL, auquel cas vous devriez gérer cela avec élégance. Je montre la partie "inhabituelle" vérifiant si l'objet donné est appelable. Notez que PyDECREF échoue si le pointeur d'objet est NULL, pas Py_XDECREF. Et maintenant pour le code - il peut y avoir une meilleure façon de résoudre tout cela, mais cela fonctionne très bien pour moi et malheureusement la documentation est extrêmement manquant.

C++ Code:

#include <Python.h> 

static PyThreadState *mainstate; 

void initPython(){ 
    PyEval_InitThreads(); 
    Py_Initialize(); 
    mainstate = PyThreadState_Swap(NULL); 
    PyEval_ReleaseLock(); 
} 

void exitPython(){ 
    PyEval_AcquireLock(); 
    PyThreadState_Swap(mainstate); 
    Py_Finalize(); 
} 

void callScript() { 
    PyGILState_STATE gstate = PyGILState_Ensure(); 
    PyObject *pName = PyUnicode_FromString("Startup"); 
    PyObject *pModule = PyImport_Import(pName); 
    Py_DECREF(pName); 
    PyObject *pFunc = PyObject_GetAttrString(pModule, "startup"); 
    if (pFunc && PyCallable_Check(pFunc)) { 
     PyObject *arglist = Py_BuildValue("(u)", "TestScript"); 
     PyObject *result = PyObject_CallObject(pFunc, arglist); 
     Py_DECREF(arglist); 
     // Now you have the returned object of the function - do something with it. 
     // In our case that's None, but you should extend the python scrip to return 
     // whatever you need - see the profiler API. 
     Py_DECREF(result);   
    } 
    Py_XDECREF(pFunc); // XDECREF does not fail if pointer is NULL. 
    Py_DECREF(pModule); 
    PyGILState_Release(gstate); 
} 

int main() { 
    printf("Start.\n"); 
    initPython(); 
    callScript(); 
    exitPython(); 
    printf("Exit.\n"); 
    return 0; 
} 

Votre script spécifique qui est toujours appelé, changer cela pour que vous revenez toutes les données que vous voulez d'une manière utile - au moment où nous utilisons juste cProfile.run() qui juste imprime quelques informations:

Startup.py 
import cProfile 

def startup(module_name): 
    print("Start script") 
    cProfile.run("import " + module_name) 
    print("Finished script") 

Enfin le script trivial qui est exécuté:

TestScript.py 
sum = 0 
for i in range(10000): 
    sum += i 
+0

Merci Voo, je Je vais devoir lire ceci un peu plus en détail, mais vous m'avez beaucoup aidé. Merci encore :) – easythrees

+1

L'ai assemblé à partir d'un code assez complexe et son 3h ici, donc j'espère que je n'ai pas fait d'erreur ici. Il est temps d'aller me coucher :) – Voo

Questions connexes