从 Python C 扩展内部导入和使用标准 Python 模块

发布于 2025-01-04 04:17:44 字数 108 浏览 1 评论 0原文

我有用 C 编写的 Python 扩展模块。我想在此 C 代码中使用标准 Python 模块之一,例如 osshutil。如何最好地做到这一点?

I have Python extension module written in C. I want to use in this C code one of the standard Python modules, for example os or shutil. How is best to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

满意归宿 2025-01-11 04:17:44
PyObject* os = PyImport_ImportModuleNoBlock("os");
if (os == NULL)
  return NULL;
someattr = PyObject_GetAttrString(os, "someattr");
Py_DECREF(os);

如果您仅导入模块一次,例如在 init_yourmodule() 函数中,则使用 PyImport_ImportModule("os")

PyObject* os = PyImport_ImportModuleNoBlock("os");
if (os == NULL)
  return NULL;
someattr = PyObject_GetAttrString(os, "someattr");
Py_DECREF(os);

If you import the module only once e.g., in init_yourmodule() function then use PyImport_ImportModule("os").

洒一地阳光 2025-01-11 04:17:44

不。

相反,更改您的扩展模块,以便它向 Python 提供服务,然后编写调用 osshutil 和您的模块的 Python 代码。

事实上,对于 os 模块中的许多内容,编写本机 C 代码可能比调用 Python 更好。

当然,你可以从 C 代码调用 Python 模块,只是这样做对于像 os 和 Shututil 这样的低级模块来说有点过分了。当谈到 shutil 中的文件复制方法时,在 C 代码中重新实现它们是很简单的。事实上,在 Windows 上,复制文件是通过调用操作系统来完成的,因此甚至不需要用 C 编写太多代码。

如果 Python 模块是用 C 编写的,您甚至可以只复制所需方法的代码。

Don't.

Instead, change your extension module so that it provides a service to Python, and then write Python code which calls os, shutil and your module.

In fact, for a lot of the content in the os module it is probably better to write native C code rather than call into Python.

Of course, you can call Python modules from C code, it's just that doing that is overkill for low level modules like os and shutil. When it comes to the file copying methods in shutil reimplementing them in your C code is trivial. In fact, on Windows, copying a file is done by a call to the OS so there is not much code to even write in C.

If the Python module is written in C you could even just copy the code for the methods that you need.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文