2008-11-12 7 views
6

J'ai quelques variables globales dans un script Python. Certaines fonctions de ce script appellent C - est-il possible de définir une de ces variables en C et si oui, comment? J'apprécie que ce n'est pas un très beau design en premier lieu, mais je dois faire un petit changement au code existant, je ne veux pas se lancer dans la refonte majeure des scripts existants.Comment accéder à une variable globale Python à partir de C?

Répondre

11

Je ne suis pas un gourou python, mais j'ai trouvé cette question intéressante, donc j'ai fait des recherches. This a été le premier succès sur "python embedding API" - aide-t-il?

Si les attributs appartiennent à la portée globale d'un module, vous pouvez utiliser « PyImport_AddModule » pour obtenir une poignée à l'objet du module. Par exemple, si vous vouliez obtenir la valeur d'un entier dans le module principal nommé « foobar », vous procédez comme suit:

PyObject *m = PyImport_AddModule("__main__"); 
PyObject *v = PyObject_GetAttrString(m,"foobar"); 

int foobar = PyInt_AsLong(v); 

Py_DECREF(v); 
+0

'Ce' lien est cassé - quelqu'un at-il un lien fixe? – leecbaker

+0

Correction - Odd qu'ils réorganiseraient les archives de la liste comme ça, mais googler pour le texte cité trouvé le message assez facilement. :-) –

0

Je recommande d'utiliser pyrex pour faire une extension module vous pouvez stocker les valeurs dans python, et cdef un tas de fonctions qui peuvent être appelées à partir de C pour y retourner les valeurs. Sinon, cela dépend beaucoup du type de valeurs que vous essayez de transmettre.

0

Êtes-vous prêt à modifier l'API a un petit bit?

  • Vous pouvez faire la fonction C retourne la nouvelle valeur pour le monde, puis l'appeler comme ceci:

    my_global = my_c_func(...)

  • Si vous utilisez Robin ou l'API Python C directement , vous pouvez passer le dictionnaire global comme paramètre supplémentaire et le modifier

  • Si votre global est toujours dans le même module, la solution de Sherm est superbe
Questions connexes