[英]Python C extension: Use extension PYD or DLL?
我有一个用 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
假设您的 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 扩展名(按此顺序)。 如果我在C:\\python27\\lib\\site-packages
foo.pyd
C:\\python27\\lib\\site-packages
有foo.pyd
,则import foo
有效。 如果我将该文件重命名为foo.dll
,则import foo
失败。
根据在 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
在 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 下的许多简单示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.