PyImport_Import против импорта - PullRequest
1 голос
/ 18 мая 2009

Я пытался заменить

PyRun_SimpleString("import Pootle");

с

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

после инициализации модуля Pootle в некотором C-коде. Первое, кажется, делает имя Pootle доступным для последующих вызовов PyRun_SimpleString, а второе - нет.

Может кто-нибудь объяснить мне разницу? Есть ли способ сделать то, что первый делает с вызовами C API?

Спасибо

1 Ответ

3 голосов
/ 18 мая 2009

Все, что делает вызов PyImport_Import, возвращает ссылку на модуль - он не делает такую ​​ссылку доступной для других частей программы. Итак, если вы хотите, чтобы PyRun_SimpleString увидел ваш новый импортированный модуль, вам нужно добавить его вручную.

PyRun_SimpleString работает автоматически в пространстве имен модуля __main__. Не обращая большого внимания на проверку ошибок (опасайтесь NULL-возвратов!), Это общая схема:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...