【问题标题】:Cython pyd files not importing through pythonCython pyd 文件未通过 python 导入
【发布时间】:2017-09-24 15:59:21
【问题描述】:

我正在用 python 编写一个模拟粒子反应的程序,目的是向用户介绍粒子反应。由于 python 在进行必要的处理时速度太慢,我求助于 Cython 以提高速度,它奏效了。我可以将我的.pyx 文件编译成.pyd 文件,该文件可以通过简单的import 语句(即“导入模块”)从python 导入和运行。

但是,程序最终必须在另一个人的计算机上运行,​​而在这台计算机上,.pyd 文件将无法导入。当我尝试时,我收到此错误消息:

"ImportError: DLL load failed: The specified module could not be found."

.pyd 文件在两台计算机上的位置完全相同,但是,我运行的是 python 3.6,而另一台计算机安装了 python 3.3。另外,我的电脑安装了 Cython,而另一台电脑没有。两台机器都是 32 位的。

我不能简单地将整个程序编译为 .exe 文件,因为另一台计算机在 .exe 文件上有一个块。

我在 Cython 上浏览了 stack 的问题,并且还研究了 Cython 文档,但均无济于事。

有人可以向我解释为什么导入不起作用,以及如何让它起作用吗?关于 .pyd 文件到底是什么以及 python 如何调用它们的一些额外背景也会很好。

编辑:我从名为 main.py 的文件运行程序。在同一个目录中,我有一个名为 main 的文件夹,其中存储了我在模块中使用的代码。 main.py 调用PageManager.py,后者调用ParticleModel.py,后者调用MoveParticles.pyd。 (这三个文件存放在文件夹 main 中)。我用语句

"import main.MoveParticles" 

导入 .pyd 文件,该文件可在我的计算机上运行。

【问题讨论】:

  • 我已编辑我的问题以提供这些详细信息。不幸的是,我无法上传图片,否则我会向您展示实际文件...
  • 你的 setup.py 是什么样子的?
  • #cython setup file from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize(MYFILEPATH.pyx)) 我编译了我的 .pyx 文件,然后移动了生成的 .pyd 文件从我的 python 文件夹到我的主文件夹内(之前引用过)
  • 我对 Windows 没有太多经验,但您的 pyd 将依赖于一些运行时。也许这个运行时没有安装在另一台机器上,或者其他 python 版本使用了另一个运行时?
  • 编译器版本不同wiki.python.org/moin/WindowsCompilers,因此不兼容。但即使编译器兼容(Linux),在使用不同的 Python 版本时也可能会遇到问题。我认为最简单的方法是为多个 Python 版本编译一个 pyd 文件。

标签: python python-3.x cython python-import


【解决方案1】:

根据https://cython-devel.python.narkive.com/gqx0VU3L/importerror-dll-load-failed-the-specified-module-could-not-be-found

只是解释您描述的错误(ImportError: DLL load failed: 找不到),动态链接器找不到 它需要的图书馆。这很可能是失踪的症状 依赖关系或路径问题。以下是我的诊断建议 并解决问题:

缺少依赖项: 一种非常简单的方法来确认您的所有依赖项 cython 模块是 可用的是将依赖项walker实用程序[1]指向它,并且 查找丢失的 DLL。

目录结构: 您从 cython 模块中构建的 .pyd 文件是 PYTHONPATH(或您当前的 工作目录?如果不是,那就是你的问题。

如果缺少依赖项,请在此处下载依赖项遍历器:http://www.dependencywalker.com/。然后打开您的 .pyd 文件并稍等片刻。查看主分支中是否缺少文件,并将这些文件添加到包含 python38.dll 的目录中(我的情况是:C:\Users\PC\AppData\Local\Programs\Python\Python38)。

【讨论】:

    【解决方案2】:

    好的,这里的困难源于对缺少哪个 DLL 的混淆。

    我曾(天真地)假设因为我试图导入一个 .pyd 文件,它本质上是一个 DLL,(Python C extension: Use extension PYD or DLL?),这是导致错误的原因。

    但是,实际上导致错误的原因是缺少运行我的 .pyd 文件所需的 DLL。我通过使用不同版本的 python(准确地说是 3.5)解决了这个问题,并且在重新编译我的 .pyd 文件以在 python 3.5 上工作后,应用程序工作得很好。

    总结:试图运行我的文件的计算机缺少一些必要的 DLL,因此导致程序崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 2016-07-22
      相关资源
      最近更新 更多