以下是在 C/C++ 中扩展嵌入式 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)行。
( 1)有效,无需在第(3)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
我想了解两种导入方式之间的区别。他们是否将模块导入不同的名称空间/范围?
Python 3 文档引导我走这条路:
- PyImport_ImportModule最好参考Python内置函数来描述
__import__()
__import__()
函数由 import 语句调用。
也许我犯了一个错误,假设PyImport_ImportModule
是一对一的等价物,我应该使用PyImport_ImportModuleEx和正确的(究竟是哪个?)全局变量和局部变量,所以我的“emb”位于我的嵌入式解释器的全局命名空间中。