Python C扩展:使用PYD还是DLL?
我有一个用C语言写的Python扩展,我想知道在Windows系统下我应该用DLL还是PYD作为文件扩展名。(在Linux下我应该用什么呢?)
这两者之间有什么区别吗?(除了文件名)
我找到了一篇非官方的文章。这和pyc有什么关系吗?为什么我找不到任何关于这个主题的官方文章呢?
4 个回答
假设你的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
就会失败。
根据《创建你自己的项目》这一步(“食谱方法”的第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
.pyd 文件其实就是为 Python 准备好的 dll 文件。
为了和普通的 dll 文件区分开来,我建议在 Windows 系统中使用 .pyd 后缀,而不是 .dll。
这里有关于这个问题的官方文档:
http://docs.python.org/faq/windows.html#is-a-pyd-file-the-same-as-a-dll