Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过python c api导入*_Python_C - Fatal编程技术网

如何通过python c api导入*

如何通过python c api导入*,python,c,Python,C,例如,从python中,如果我想从另一个模块中获得符号,我会: from os.path import * 如何使用pythoncapi实现这一点? 我已经阅读了这里的文档: 但如何做到这一点并不明显 我正在尝试将符号导入我使用Py_InitModule创建的模块。我找到了一种可行的方法 使用PyDict_Merge合并模块字典。 应将一个模块中的符号合并到另一个模块中 但是,我最终将它们合并到了全局名称空间中。 所以 将mod导入的符号合并到全局名称空间。没有用于此的C API函数。您有两

例如,从python中,如果我想从另一个模块中获得符号,我会:

from os.path import *
如何使用pythoncapi实现这一点? 我已经阅读了这里的文档: 但如何做到这一点并不明显


我正在尝试将符号导入我使用Py_InitModule创建的模块。

我找到了一种可行的方法

使用PyDict_Merge合并模块字典。

应将一个模块中的符号合并到另一个模块中

但是,我最终将它们合并到了全局名称空间中。 所以


将mod导入的符号合并到全局名称空间。

没有用于此的C API函数。您有两个选项:punt到pythonapi,或者手动更新名称空间

如果您想跳转到Python API,可以使用类似于从os.path import*运行的东西,将模块的u dict_u_u作为全局和局部。看起来是这样的:

PyObject *borrowed_dict = PyModule_GetDict(your_module);
PyObject *ret = PyRun_String("from os.path import *",
                             Py_file_input,
                             borrowed_dict,
                             borrowed_dict);
if (!ret) {
    // Error in import *!
    // Appropriate response is context-dependent.
    do_something_about_that();
}
Py_XDECREF(ret);
如果要手动更新名称空间,则应遵守导入模块的_所有_列表,如果没有_所有_列表,则应跳过带有前导下划线的名称。Python级别的手动执行方法是

if hasattr(module, '__all__'):
    all_names = module.__all__
else:
    all_names = [name for name in dir(module) if not name.startswith('_')]

globals().update({name: getattr(module, name) for name in all_names})
因此,将其转换为C API:检索导入模块的“全部”列表,或者构建一个默认的“全部”,如果模块没有提供,则使用导入模块中相应的全局更新模块的全局


查看这些符号可能会有所帮助。

您希望这些导入的符号去哪里?显然,不能将这些符号加载到C模块的命名空间中,因为C符号都必须在编译时定义。您试图将导入的符号加载到哪个命名空间中?kindall-哦,错过了这个细节。在我使用python APIC创建的模块中,问题是它不尊重模块的“全部”列表,也不跳过没有“全部”列表的模块的前导下划线名称。您能发布一个更好的解决方案吗?
PyObject *borrowed_dict = PyModule_GetDict(your_module);
PyObject *ret = PyRun_String("from os.path import *",
                             Py_file_input,
                             borrowed_dict,
                             borrowed_dict);
if (!ret) {
    // Error in import *!
    // Appropriate response is context-dependent.
    do_something_about_that();
}
Py_XDECREF(ret);
if hasattr(module, '__all__'):
    all_names = module.__all__
else:
    all_names = [name for name in dir(module) if not name.startswith('_')]

globals().update({name: getattr(module, name) for name in all_names})