我有一个用C编写的Python扩展,我想知道我是否应该在Windows下使用文件扩展名DLL或PYD。 (我会在Linux中使用什么?)
是否有任何差异(文件名除外)?
我找到了an unofficial article。这是pyc的秘密吗? 为什么我找不到关于这个主题的官方文章?
答案 0 :(得分:20)
pyd文件只是为python导入准备的dll文件。
为了将它们与普通的dll区分开来,我建议在Windows中使用.pyd而不是.dll。
以下是关于此问题的官方文档:
http://docs.python.org/faq/windows.html#is-a-pyd-file-the-same-as-a-dll
答案 1 :(得分:6)
假设您的Python扩展foo
旨在用作可通过import foo
访问的模块,您无需知道文件扩展名应在什么操作系统上。您只需使用distutils
即可。您将在Windows上获得.pyd,在Linux上获得.so等。阅读此documentation。
更新以响应@gecko的评论“”“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
会失败。
答案 2 :(得分:6)
根据创建自己的项目步骤(Building C and C++ Extensions on Windows
的“食谱方法”的第7步)输出文件应称为spam.pyd(在发布模式下)或spam_d.pyd(在调试模式下)。选择扩展名.pyd是为了避免与您的模块可能是Python接口的系统库spam.dll混淆。
因此.pyd文件只是一个重命名的DLL,可以避免混淆。
在Linux上,从经验来看,似乎你需要使用.so扩展名来实现python dll。这只是一个标准的unix共享库。我无法提供为什么Linux上的python不会更改文件扩展名的来源或原因,但我可以向您展示如何演示它。在shell中,运行以下命令:
python -vv
>>> import fakemodule
您会注意到输出显示:
尝试/usr/lib/python2.5/site-packages/fakemodule.so
答案 3 :(得分:2)
在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中导出的功能,请使用this tool
更新: 这是一个使用distutils和SWIG来构建扩展的示例。检查this article,它显示了Windows和Linux下的许多简单示例。