Python C扩展:使用扩展名PYD或DLL?

时间:2011-11-24 22:03:18

标签: python python-c-extension pyd

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

是否有任何差异(文件名除外)?

我找到了an unofficial article。这是pyc的秘密吗? 为什么我找不到关于这个主题的官方文章?

4 个答案:

答案 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下的许多简单示例。