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

31 投票
4 回答
33817 浏览
提问于 2025-04-17 07:01

我有一个用C语言写的Python扩展,我想知道在Windows系统下我应该用DLL还是PYD作为文件扩展名。(在Linux下我应该用什么呢?)

这两者之间有什么区别吗?(除了文件名)

我找到了一篇非官方的文章。这和pyc有什么关系吗?为什么我找不到任何关于这个主题的官方文章呢?

4 个回答

8

假设你的Python扩展 foo 是为了作为一个模块使用的,可以通过 import foo 来导入,那么你不需要关心在不同操作系统上文件名的后缀是什么。你只需要使用 distutils 工具。这样在Windows上你会得到一个 .pyd 文件,而在Linux上则会得到一个 .so 文件等等。你可以查看这个 文档 来了解更多信息。

更新 针对 @gecco 的评论

无论是 dll 还是 pyd 扩展类型,import foo 都可以正常工作。扩展名在这里并不重要……:

对我来说(Python 2.7.1,Windows 7),使用 python -vv 命令时,只会搜索到 pyd、py、pyw 和 pyc 这些后缀(按这个顺序)。如果我在 C:\python27\lib\site-packages 目录下有一个 foo.pyd 文件,import foo 就能成功。如果我把这个文件重命名为 foo.dll,那么 import foo 就会失败。

9

根据《创建你自己的项目》这一步(“食谱方法”的第7步)在Windows上构建C和C++扩展中的说明:

输出文件应该叫做spam.pyd(在发布模式下)或者spam_d.pyd(在调试模式下)。之所以选择.pyd这个扩展名,是为了避免和系统库spam.dll混淆,因为你的模块可能是这个库的Python接口。

所以,.pyd文件其实就是把DLL文件改个名字,以免搞混。

不过在Linux上,根据我的经验,Python的DLL文件需要用.so这个扩展名。这是标准的Unix共享库。我不能提供为什么Python在Linux上不改变文件扩展名的来源或理由,但我可以告诉你怎么演示这一点。在命令行中运行以下命令:

python -vv
>>> import fakemodule

你会注意到输出显示:

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

29

.pyd 文件其实就是为 Python 准备好的 dll 文件。

为了和普通的 dll 文件区分开来,我建议在 Windows 系统中使用 .pyd 后缀,而不是 .dll。

这里有关于这个问题的官方文档:

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

撰写回答