2012-03-05 17 views
5

Sto cercando di capire come utilizzare l'interprete Python da C e ho problemi con PyEval_EvalCode. Fondamentalmente, sto scrivendo una funzione C che contiene una stringa arbitraria di codice Python, la compila, la esegue e poi stampa il risultato.Python: Utilizzo di PyEval_EvalCode

Il problema è che quando stampo il risultato, ottengo sempre None, anche se ovviamente l'espressione non viene valutata su None.

Ecco il codice (con controllo di errore e il conteggio di riferimento rimossi per chiarezza):

void eval(const char* s) 
{ 
    PyCodeObject* code = (PyCodeObject*) Py_CompileString(s, "test", Py_file_input); 
    PyObject* main_module = PyImport_AddModule("__main__"); 
    PyObject* global_dict = PyModule_GetDict(main_module); 
    PyObject* local_dict = PyDict_New(); 
    PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict); 

    PyObject* result = PyObject_Str(obj); 
    PyObject_Print(result, stdout, 0); 
} 

Ho provato a chiamare questa funzione con "5 + 5" come ingresso, ed è visualizzato None. Sto usando PyEval_EvalCode in modo errato?

risposta

7

Se si desidera valutare un'espressione, è necessario utilizzare Py_eval_input come argomento su Py_CompileString.

La mia comprensione della questione è che:

  • Py_eval_input è equivalente alla built-in eval - è valuta un'espressione.
  • Py_file_input equivale a exec - Esegue codice Python, ma non restituisce nulla.
  • Py_single_input valuta un'espressione e ne stampa il valore, utilizzato nell'interprete.

Vedere here per ulteriori informazioni, ma la documentazione su questo argomento è debole.