这是C/C++中的extending embedded Python 3.x程序的规范示例:
#include <Python.h>
//// Definition of 'emb' Python module ////////////////////
static PyObject* emb_foo(PyObject *self, PyObject *args)
{
char const* n = "I am foo";
return Py_BuildValue("s", n);
}
static PyMethodDef EmbMethods[] = {
{"foo", emb_foo, METH_VARARGS, "Returns foo"},
{NULL, NULL, 0, NULL}
};
static PyModuleDef EmbModule = {
PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods,
NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void)
{
return PyModule_Create(&EmbModule);
}
//// Embedded Python with 'emb' loaded ////////////////////
int main()
{
PyImport_AppendInittab("emb", &PyInit_emb);
Py_Initialize();
PyRun_SimpleString("import emb\n"); // (1)
//PyImport_ImportModule("emb"); // (2)
PyRun_SimpleString("print(emb.foo())\n"); // (3)
Py_Finalize();
return 0;
}
我将
emb
模块添加到嵌入式解释器的内置模块中。我还想自动导入它,因此用户不必在提供给我的嵌入式解释器的脚本中发出
import emb
语句。我正在尝试两种导入方式,分别在(1)和(2)中。
在(3)行中的简单测试中,无需显式导入即可找到(1)的工作原理和
emb
模块。但是,如果我注释掉(1)行,并且取消注释掉(2)行以使用Python 3调用的C API导入,那么(3)行会产生错误:Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'emb' is not defined
我想了解两种导入方式之间的区别。
他们是否将模块导入到不同的namespaces / scopes中?
Python 3文档引导我走了这条路:
最好通过引用内置的Python函数
__import__()
来描述__import__()
函数由import语句调用。 假设
PyImport_ImportModule
是一一对应的,也许我犯了一个错误,并且我应该在PyImport_ImportModuleEx中使用正确的(确切地说是?)全局变量和局部变量,因此我的“emb”位于我的嵌入式解释器的全局命名空间中。 最佳答案
__import__
根本不将模块放在任何命名空间中,而是返回它。import
调用__import__
,并将结果存储在变量中。
docs说import spam
的功能类似于:
spam = __import__('spam', globals(), locals(), [], 0)
为了在C API中获得相同的效果,您需要分配给
emb
全局。换句话说,在emb
模块上设置__main__
属性。PyObject* emb_module = PyImport_ImportModule("emb");
PyObject* main_module = PyImport_AddModule("__main__");
PyObject_SetAttrString(main_module, "emb", emb_module);
Py_XDECREF(emb_module);
/* (main_module is a borrowed reference) */