【问题标题】:How to import a .pyd file as a python module?如何将 .pyd 文件作为 python 模块导入?
【发布时间】:2018-05-10 17:04:59
【问题描述】:

我正在使用 PyCharm。我在以下位置有一个 python 脚本:

C:\Users\XYZ\PycharmProjects\Project1\playground.py

playground.py只有一行代码如下图:

import PyTbl

Project1 文件夹中还有另一个文件:

C:\Users\XYZ\PycharmProjects\Project1\PyTbl.pyd

当我运行 Python 脚本 playground.py 时,我收到以下错误:

ImportError: numpy.core.multiarray failed to import
Traceback (most recent call last):
  File "C:/Users/XYZ/PycharmProjects/Project1/playground.py", line 1, in <module>
    import PyTbl
SystemError: initialization of PyTbl raised unreported exception

如果我在 PyCharm 编辑器中将鼠标悬停在 playground.py 中的 Python 代码行上,我会收到以下错误消息:

"No module named PyTbl"

知道如何将.pyd 文件导入 Python 脚本吗?

【问题讨论】:

  • 一个.pyd python文件基本上是一个windows dll文件,我认为你不能因此导入它(它是编译的python代码)。我不确定这个文件包含什么,如果它需要被编译成可读的 python,但你可以尝试将扩展名更改为 .py 而不是 .pyd。
  • 您的目录中有__init__.py 文件吗?这是一个空文件,用于导入不在默认库中的 .py 文件。
  • 您的导入语句是正确的。这就是您导入.pyd 文件的方式。但它不是 Python,它是目标代码,可能最初是 C。如果 DLL 没有加载,那通常是因为 (1) 它试图加载另一个丢失或找不到的 DLL;或 (2) 您拥有 32 位系统,而您的代码正试图加载 64 位 DLL,或者反之亦然
  • @NaruS:是的,我的目录中也有__init__.py

标签: python windows pycharm pyd


【解决方案1】:

.pyd 基本上是一个 Windows .dll 文件。

.pyd 文件是dll’s,但有一些区别。如果你有一个名为 foo.pyd 的 DLL,那么它必须有一个函数 PyInit_foo()。然后您可以编写 Python import foo,Python 将搜索 foo.pyd(以及 foo.pyfoo.pyc),如果找到它,将尝试调用 PyInit_foo() 来初始化它。不要将 .exe 与 foo.lib 链接,因为这会导致 Windows 要求 DLL 存在。

请注意,foo.pyd 的搜索路径是 PYTHONPATH,与 Windows 用于搜索 foo.dll 的路径不同。此外,foo.pyd 不需要存在即可运行您的程序,而如果您将程序与dll 链接,则需要dll。当然,如果你想说import foofoo.pyd 是必需的。在 DLL 中,链接在源代码中声明为 __declspec(dllexport)。在.pyd 中,链接是在可用函数列表中定义的。

Reference

【讨论】:

    【解决方案2】:

    肯定会起作用的一件事是在启动 PyCharm 之前设置 PYTHONPATH 环境变量以包含 .pyd 文件所在的目录。我不知道 PyCharm 本身是否有更简单的方法。

    【讨论】:

    • 太棒了! Confirmed 与 PyCharm 2020.2 配合良好。设置好环境变量后记得重启 PyCharm。
    • 另外,因为我使用了 python boost,所以我需要做更多的调整:1. Python Boost 1.7.6 适用于 Python 3.9.x - 安装了 python 3.9。 x 2. 在 PyCharm 项目设置中,将解释器设置为 Phython 3.9 3. 在 Visual Studio 中 - 将输出文件设置为 pyd ($(OutDir)$(TargetName)$ (TargetExt) --> $(OutDir)$(TargetName).pyd) - 很好,避免手动重命名 4. pyd 的名称必须与您要导入的包(即 PyInit_,例如“MyPackage.pyd”应该有一个暴露的 PyInit_MyPackage)。 5. ...
    【解决方案3】:

    如果你有一个名为 foo.pyd 的 DLL,那么它必须有一个函数 PyInit_foo()。然后,您可以编写 Python “import foo”,Python 将搜索 foo.pyd(以及 foo.py、foo.pyc),如果找到,将尝试调用 PyInit_foo() 来初始化它。不要将 .exe 与 foo.lib 链接,因为这会导致 Windows 要求 DLL 存在。

    请注意,foo.pyd 的搜索路径是 PYTHONPATH,与 Windows 用于搜索 foo.dll 的路径不同。此外,运行程序不需要存在 foo.pyd,而如果您将程序与 dll 链接,则需要 dll。当然,如果要说 import foo,则需要 foo.pyd。在 DLL 中,链接在源代码中使用 __declspec(dllexport) 声明。在 .pyd 中,链接是在可用函数列表中定义的。

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

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      相关资源
      最近更新 更多