8

我正在使用 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

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

"No module named PyTbl"

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

4

3 回答 3

8

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

.pyd文件是dll’s,但有一些差异。如果你有一个名为 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不需要在场即可运行您的程序,而如果您将程序与 a 链接dll,则dll是必需的。当然,foo.pyd如果你想说的话是必须的import foo。在 DLL 中,链接在源代码中以__declspec(dllexport). 在 a.pyd中,链接是在可用函数列表中定义的。

参考

于 2020-02-13T13:05:03.377 回答
2

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

于 2019-03-06T09:32:28.673 回答
-1

如果你有一个名为 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

于 2021-08-09T08:45:10.863 回答