PyImport_Import 与 import 的区别

2 投票
1 回答
2754 浏览
提问于 2025-04-15 11:40

我尝试在一些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);

撰写回答