gpt4 book ai didi

c++ - PyImport_ImportModule 和 import 语句是否加载到不同的命名空间?

转载 作者:太空狗 更新时间:2023-10-29 22:27:42 24 4
gpt4 key购买 nike

这是程序的典型示例 extending embedded Python 3.x在 C/C++ 中:

#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) to import with C API of Python 3 call,则行 (3 ) 产生错误:

Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'emb' is not defined

我想了解这两种导入方式之间的区别。他们是否将模块导入不同的 namespaces / scopes

Python 3 文档引导我走这条路:

  1. PyImport_ImportModule最好通过引用内置 Python 函数 __import__()
  2. 来描述
  3. __import__()函数由 import 语句调用。

也许我犯了一个错误,假设 PyImport_ImportModule 是一对一的等价物,我应该使用 PyImport_ImportModuleEx具有正确的(究竟是哪个?)全局变量和局部变量,所以我的“emb”位于我的嵌入式解释器的全局命名空间中。

最佳答案

__import__ 根本没有将模块放入任何命名空间,而是返回它。import 调用 __import__,并将结果存储在一个变量中。docs假设 import spam 做了类似的事情:

spam = __import__('spam', globals(), locals(), [], 0)

要在 C API 中获得相同的效果,您需要分配给 emb 全局。换句话说,在 __main__ 模块上设置 emb 属性。

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) */

关于c++ - PyImport_ImportModule 和 import 语句是否加载到不同的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7998816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com