我试图替换
PyRun_SimpleString("import Pootle");
与
PyObject *obj = PyString_FromString("Pootle");
PyImport_Import(obj);
Py_DECREF(obj);
在一些C代码中初始化模块Pootle之后。第一个似乎使名称Pootle
可用于后续的PyRun_SimpleString
次调用,但第二次没有。
有人可以向我解释一下这个区别吗?有没有办法做第一个C API调用的工作?
由于
答案 0 :(得分:3)
所有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);