我正在编写一个模拟粒子反应的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的堆栈问题,并且还研究了Cython文档,但都无济于事。
有人可以向我解释为什么导入无法正常工作,以及如何让它工作?关于.pyd
文件到底是什么以及python如何调用它们的一些额外背景也很好。
编辑:我从一个名为main.py的文件中运行该程序。在同一目录中,我有一个名为main的文件夹,它存储我在模块中使用的代码。 main.py调用PageManager.py,它调用调用MoveParticles.pyd的ParticleModel.py。 (这三个文件存储在主文件夹中)。我使用语句
"import main.MoveParticles"
导入.pyd文件,该文件适用于我的电脑。
答案 0 :(得分:1)
只是解释你描述的错误(ImportError: DLL load 失败:找不到),动态链接器找不到 它需要的图书馆。这很可能是失踪的症状 依赖或路径问题。这是我的诊断建议 并解决问题:
缺少依赖项: 一种非常简单的方法来确认您的所有依赖项 cython 模块是 可用是将依赖项walker实用程序[1]指向它,并且 查找丢失的 DLL。
目录结构: 您是从 cython 模块中构建的 .pyd 文件吗? PYTHONPATH(或您当前的 工作目录?如果不是,那就是你的问题。
如果缺少依赖项,请在此处下载依赖项walker:http://www.dependencywalker.com/。然后打开您的 .pyd 文件并稍等片刻。查看主分支中是否缺少文件,并将这些文件添加到包含 python38.dll 的目录中(我的情况是:C:\Users\PC\AppData\Local\Programs\Python\Python38)。
答案 1 :(得分:0)
好的,这里的困难源于对哪些DLL丢失感到困惑。
我(天真地)假设因为我试图导入.pyd文件,这本质上是一个DLL,(Python C extension: Use extension PYD or DLL?),这导致了错误。
然而,实际导致错误的是缺少运行我的.pyd文件所需的DLL。我通过使用不同版本的python(准确地说是3.5)解决了这个问题,并且在重新编译我的.pyd文件以便在python 3.5上工作之后,该应用程序得到了很好的处理。
总结:尝试运行我的文件的计算机缺少一些必要的DLL,因此导致程序崩溃。