29

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

有什么区别(除了文件名)?

我找到了一篇非官方的文章。这就是pyc的秘密吗?为什么我找不到有关此主题的任何官方文章?

4

4 回答 4

28

pyd 文件只是准备好用于 python 导入的 dll 文件。

为了将它们与普通 dll 区分开来,我建议在 Windows 中使用 .pyd 而不是 .dll。

这是有关此问题的官方文档:

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

于 2011-12-12T07:23:03.713 回答
9

根据在 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

于 2011-12-15T13:29:30.850 回答
8

假设您的 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.pydC:\python27\lib\site-packages工作import foo。如果我将该文件重命名为foo.dll,则import foo失败。

于 2011-11-24T22:46:18.827 回答
3

在 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 下的简单示例。

于 2011-12-15T13:14:57.960 回答