【发布时间】:2011-12-21 09:06:09
【问题描述】:
这里是 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) 行。
(1) 有效,emb 模块无需显式导入即可在 (3) 行的简单测试中找到。但是,如果我注释掉行 (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 文档引导我走上了这条道路:
-
PyImport_ImportModule最好参考Python内置函数
__import__()来描述 -
__import__()函数由 import 语句调用。
也许我犯了一个错误,假设 PyImport_ImportModule 是一对一等价的,我应该将 PyImport_ImportModuleEx 与正确的(究竟是哪个?)全局变量和局部变量一起使用,所以我的“emb”位于我嵌入式的全局命名空间中口译员。
【问题讨论】:
标签: c++ python import python-c-api python-embedding