繁体   English   中英

Python C 扩展:使用扩展 PYD 还是 DLL?

[英]Python C extension: Use extension PYD or DLL?

我有一个用 C 编写的 Python 扩展,我想知道我是否应该在 Windows 下使用文件扩展名 DLL 或 PYD。 (我会在 Linux 中使用什么?)

有什么区别吗(除了文件名)?

我找到了一篇非官方的文章 这就是pyc的秘密吗? 为什么我找不到有关此主题的任何官方文章?

pyd 文件只是准备用于 python 导入的 dll 文件。

为了将它们与普通的 dll 区分开来,我建议在 Windows 中使用 .pyd 而不是 .dll。

这是有关此问题的官方文档:

http://docs.python.org/faq/windows.html#is-a-pyd-file-the-same-as-a-dll

假设您的 Python 扩展foo旨在用作模块,可通过import foo访问,您不需要知道文件扩展名在什么操作系统上应该是什么。 您只需使用distutils 您将在 Windows 上获得 .pyd,在 Linux 等上获得 .so。阅读此文档

更新以回应@gecco 的评论

import foo 可以同时使用两种扩展类型:dll 和 pyd。 扩展名在这里无关紧要...:

对我而言(Python 2.7.1,Windows 7), python -vv仅显示正在搜索的 pyd、py、pyw 和 pyc 扩展名(按此顺序)。 如果我在C:\\python27\\lib\\site-packages foo.pyd C:\\python27\\lib\\site-packagesfoo.pyd ,则import foo有效。 如果我将该文件重命名为foo.dll ,则import foo失败。

根据在 Windows 上构建 C 和 C++ 扩展创建您自己的项目步骤(“食谱方法”的第 7 步)

输出文件应命名为 spam.pyd(在发布模式下)或 spam_d.pyd(在调试模式下)。 选择扩展名 .pyd 是为了避免与系统库 spam.dll 混淆,您的模块可以是 Python 接口。

所以 .pyd 文件只是一个重命名的 DLL 以防止混淆。

然而,在 linux 上,从经验来看,您似乎需要为 python dll 使用 .so 扩展名。 这只是一个标准的 Unix 共享库。 我无法提供为什么 linux 上的 python 不更改文件扩展名的来源或原因,但是我可以向您展示如何演示它。 在 shell 中,运行以下命令:

python -vv
>>> import fakemodule

您会注意到输出显示:

尝试 /usr/lib/python2.5/site-packages/fakemodule.so

在 Windows 中,你可以使用 *.pyd 直接从 Python import foo但对于 *.dll 你应该使用这个:

from ctypes import cdll
#load dll file , the file in the same .py file location or enter the full path
mylib=cdll.LoadLibrary("foo.dll") 
#call a function from this dll (c-ext) 
ReturnedValue=mylib.FunctionName()

如果您想探索此 Dll 中导出的功能,请使用此工具

更新:这是一个使用 distutils 和SWIG构建扩展的示例。 查看这篇文章,它展示了 Windows 和 Linux 下的许多简单示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM