2009-02-04 2 views
4

Je dois évaluer une expression Python de C++. Ce code semble fonctionner:Pourquoi PyRun_String n'évalue-t-il pas les littéraux booléens?

PyObject * dict = PyDict_New(); 
PyObject * val = PyRun_String(expression, Py_eval_input, dict, 0); 
Py_DECREF(dict); 

Malheureusement, il échoue horriblement si l'expression est "vrai" de "False" (qui est, val est 0 et PyErr_Occurred() retourne true). Qu'est-ce que je fais mal? Ne devraient-ils pas évaluer respectivement Py_True et Py_False?

+0

Que montre PyErr_Print() lorsque vous l'appelez après l'échec? –

+0

Je sais, j'aurais dû le faire avant, mais je ne peux pas appeler PyErr_Print() dans mon application pour un certain nombre de raisons. Quoi qu'il en soit, je l'ai reproduit dans un fichier isolé, et voici ce que j'ai obtenu: NameError: le nom 'False' n'est pas défini !! On dirait que ce littéral n'est pas disponible chez C ...! – UncleZeiv

+0

Puisque cela répond à votre question, vous devriez l'afficher comme réponse. –

Répondre

4
PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals); 

Si vous voulez Vrai et faux, ils doivent être dans le *globals dict passé à l'interprète. Vous pourrez peut-être résoudre ce problème en appelant le PyEval_GetBuiltins.

À partir du code source Python 2.6:

if (PyDict_GetItemString(globals, "__builtins__") == NULL) { 
    if (PyDict_SetItemString(globals, "__builtins__", 
       PyEval_GetBuiltins()) != 0) 
     return NULL; 
} 

Si cela ne fonctionne pas, vous pouvez essayer de PyRun_String("import __builtin__ as __builtins__", globals, locals) avant d'appeler PyRun_String("True", ...).

Vous remarquerez peut-être que l'interpréteur interactif Python exécute toujours du code dans le module __main__ que nous n'avons pas pris la peine de créer ici. Je ne sais pas si vous devez avoir un module __main__, sauf qu'il y a beaucoup de scripts qui contiennent if __name__ == "__main__".

+0

Je ne le savais pas, bonne réponse! –

+0

wow, je n'ai jamais réalisé que True, False et même None font partie du module __builtin__ ... la première solution l'a fait pour moi, merci de me pointer dans la bonne direction! J'ai trouvé quelques informations ici: http://www.python.org/doc/2.3/whatsnew/section-bool.html – UncleZeiv

Questions connexes