2016-10-14 2 views
1

J'ai besoin de lire les variables locales de Python en C/C++. Lorsque j'essaie de PyEval_GetLocals, j'obtiens une valeur NULL. Cela arrive bien que Python soit initialisé. Ce qui suit est un exemple minimal.Extension Python C: PyEval_GetLocals() retourne NULL

#include <iostream> 
#include <Python.h> 

Py_Initialize(); 
PyRun_SimpleString("a=5"); 
PyObject *locals = PyEval_GetLocals(); 
std::cout<<locals<<std::endl; //prints NULL (prints 0) 
Py_Finalize(); 

Dans the manual, il dit qu'il retourne NULL si aucun cadre est en cours d'exécution, mais ... il y a une course de cadre!

Qu'est-ce que je fais mal?

Je cours cela dans Debian Jessie.

+0

@martineau Mais même globals retourne NULL! Cela signifie-t-il que ce n'est pas la bonne façon d'obtenir les variables? Parce que j'ai déjà accepté une réponse à ce sujet. http://stackoverflow.com/questions/40041498/python-c-extension-extract-parameter-from-the-engine/40041694#40041694 –

+0

@martineau vérifier que 'PyRun_SimpleString()' fonctionne est très facile. Je peux imprimer des choses et attribuer des choses et cela fonctionne. Suggéreriez-vous un correctif pour cet exemple de code? –

+0

@martineau Cela retourne aussi NULL. Je l'ai mentionné dans ma première réponse à vous :-) –

Répondre

0

Transforme la bonne façon d'accéder à des variables dans le champ d'application est:

Py_Initialize(); 
PyObject *main = PyImport_AddModule("__main__"); 
PyObject *globals = PyModule_GetDict(main); 
PyObject *a = PyDict_GetItemString(globals, "a"); 
std::cout<<globals<<std::endl; //Not NULL 
Py_Finalize(); 
+1

Side-note: Cela fuit une référence, le programme nettoiera à la sortie, mais si vous avez besoin de déboguer des fuites de référence, ce sera une de plus La solution la plus simple consiste à changer 'PyDict_GetItem (globals, PyUnicode_FromString (" a "));' à 'PyDict_GetItemString (globals," a ");' qui est logiquement identique, sauf qu'il gère la création et la libération du 'PyUnicode 'objet pour vous, en s'assurant qu'il est correctement' DECREF'-ed – ShadowRanger

+0

@ ShadowRanger Merci beaucoup! Ceci est une note importante, et j'ai mis à jour mon code en conséquence :) J'espère qu'il n'y a plus de fuites là-bas. –

+0

Veuillez mettre à jour votre réponse afin qu'elle fasse essentiellement la même chose que ce que vous avez dans votre question. De plus, le 'PyModule_GetDict (main)' semble provoquer une erreur de compilation puisque 'main' n'est pas défini. – martineau