【发布时间】:2012-02-11 04:39:15
【问题描述】:
我有用 C 编写的 Python 扩展模块。我想在这个 C 代码中使用标准 Python 模块之一,例如 os 或 shutil。如何最好地做到这一点?
【问题讨论】:
标签: python c python-c-api python-extensions
我有用 C 编写的 Python 扩展模块。我想在这个 C 代码中使用标准 Python 模块之一,例如 os 或 shutil。如何最好地做到这一点?
【问题讨论】:
标签: python c python-c-api python-extensions
PyObject* os = PyImport_ImportModuleNoBlock("os");
if (os == NULL)
return NULL;
someattr = PyObject_GetAttrString(os, "someattr");
Py_DECREF(os);
如果您只导入一次模块,例如在init_yourmodule() 函数中,则使用PyImport_ImportModule("os")。
【讨论】:
PyImport_ImportModuleNoBlock现在是deprecated
不要。
改为更改您的扩展模块,使其为 Python 提供服务,然后编写调用 os、shutil 和您的模块的 Python 代码。
事实上,对于os 模块中的很多内容,编写本机C 代码可能比调用Python 更好。
当然,you can call Python modules from C code,只是这样做对于像os 和shutil 这样的低级模块来说太过分了。对于shutil 中的文件复制方法,在您的 C 代码中重新实现它们是微不足道的。事实上,在 Windows 上,复制文件是通过调用操作系统来完成的,因此甚至用 C 编写的代码也不多。
如果 Python 模块是用 C 编写的,您甚至可以只复制所需方法的代码。
【讨论】: