2009-05-18 6 views
1

J'ai essayé de remplacerPyImport_Import vs importation

PyRun_SimpleString("import Pootle"); 

avec

PyObject *obj = PyString_FromString("Pootle"); 
PyImport_Import(obj); 
Py_DECREF(obj); 

après initialisation du module Pootle dans un code C. Le premier semble rendre le nom Pootle disponible aux appels PyRun_SimpleString suivants, mais pas le second.

Pourriez-vous s'il vous plaît expliquer la différence pour moi? Existe-t-il un moyen de faire ce que le premier fait avec les appels API C?

Merci

Répondre

3

Tout l'appel PyImport_Import ne fait renvoyer une référence au module - il ne fait pas une telle référence disponible à d'autres parties du programme. Donc, si vous voulez PyRun_SimpleString pour voir votre nouveau module importé, vous devez l'ajouter manuellement.

PyRun_SimpleString fonctionne automatiquement dans l'espace de noms du module __main__. Sans prêter beaucoup d'attention à la vérification d'erreurs (méfiez-vous des retours NULL!), Ceci est un aperçu général:

PyObject *main = PyImport_AddModule("__main__"); 
PyObject *obj = PyString_FromString("Pootle"); 
PyObject *pootle = PyImport_Import(obj); 
PyObject_SetAttrString(main, "Pootle", pootle); 

Py_DECREF(obj); 
Py_XDECREF(pootle);