我有一个用 C 编写的 Python 扩展,我想知道是否应该在 Windows 下使用文件扩展名 DLL 或 PYD。(我会在 Linux 中使用什么?)
有什么区别(除了文件名)?
我找到了一篇非官方的文章。这就是pyc的秘密吗?为什么我找不到有关此主题的任何官方文章?
我有一个用 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
根据在 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
假设您的 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 扩展名(按此顺序)。如果我有foo.pyd
,C:\python27\lib\site-packages
工作import foo
。如果我将该文件重命名为foo.dll
,则import foo
失败。
在 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 下的简单示例。