PyImport_Import 与 import 的区别
我尝试在一些C代码中初始化Pootle模块后,将
PyRun_SimpleString("import Pootle");
替换为
PyObject *obj = PyString_FromString("Pootle");
PyImport_Import(obj);
Py_DECREF(obj);
。第一个看起来让名称Pootle
可以在后续的PyRun_SimpleString
调用中使用,但第二个却不行。
有人能给我解释一下这两者的区别吗?有没有什么方法可以用C API调用来实现第一个的功能?
谢谢
1 个回答
4
所有的 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);