【问题标题】:Python C extension: Use extension PYD or DLL?Python C 扩展:使用扩展 PYD 还是 DLL?
【发布时间】:2012-01-05 23:11:56
【问题描述】:

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

有什么不同吗(除了文件名)?

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

【问题讨论】:

  • 链接似乎不起作用,但也许这只是我的互联网。

标签: python python-c-extension pyd


【解决方案1】:

假设您的 Python 扩展 foo 旨在用作模块,可通过 import foo 访问,您不需要知道在什么操作系统上应该使用什么文件扩展名。您只需使用distutils。您将在 Windows 上获得 .pyd,在 Linux 等上获得 .so。阅读此documentation

更新以回应@gecco 的评论

import foo 适用于两种扩展类型:dll 和 pyd。扩展在这里无关紧要...:

对于我(Python 2.7.1、Windows 7),python -vv 仅显示正在搜索的 pyd、py、pyw 和 pyc 扩展名(按此顺序)。如果我在C:\python27\lib\site-packages 中有foo.pyd,则import foo 有效。如果我将该文件重命名为 foo.dllimport foo 将失败。

【讨论】:

  • import foo 可以同时使用两种扩展类型:dllpyd。扩展在这里无关紧要...
  • 事实上我做错了什么……我的错。不幸的是,我不能撤回我的反对票。我想我可以在您更新您的帖子后将其删除...
  • 从上面接受的答案中链接到的官方文档中,它指出:“请注意,foo.pyd 的搜索路径是 PYTHONPATH,与 Windows 用于搜索 foo 的路径不同。 dll。”
  • @wescpy:我不确定您是否同意我的回答,甚至您的评论有什么相关性......
  • 对不起John Machin 我的评论是针对gecco,而不是你。扩展名是什么确实重要。
【解决方案2】:

pyd 文件只是为 python 导入做好准备的 dll 文件。

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

这里是关于这个问题的官方文档:

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

【讨论】:

  • 看来这不仅是可推荐的,而且是强制性的。 .DLL,即使使用正确的 PyInit_ 和 PyModuleDef 也不能被识别为可直接导入(在 python
【解决方案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 中导出了哪些函数,请使用 this tool

更新: 这是一个使用 distutils 和 SWIG 构建扩展的示例。查看this article,它展示了许多Windows和Linux下的简单示例。

【讨论】:

  • 你错了。也可以使用 import 语句将 DLL 直接导入 Python。
  • 很抱歉我弄错了……(请参阅我在 John Machin 端口中的评论)我的错……你是对的……不幸的是,我无法撤回我的反对票。我想我可以在您更新您的帖子后将其删除...
  • @gecco 没问题。我认为 CHENZhao 发布的这个link 回答了您关于差异和官方文章存在的问题。约翰·马钦(John Machin)的帖子也有帮助。所以你所有的问题似乎都得到了回答!还要检查我更新的帖子。
  • 是的,我认为目前 CHENZhao 正在参加比赛 :-)
【解决方案4】:

根据Building C and C++ Extensions on Windows创建你自己的项目步骤(“食谱方法”的第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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2010-11-07
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多