在一台PC上无法通过PyInstaller找到DLL,但在另一台PC上却可以找到

时间:2020-06-26 20:51:31

标签: dll pyinstaller ctypes

序言

我构建了一个Flask应用程序(显然是使用Python),该应用程序通过 ctypes 与我用C语言编写的DLL进行了交互。

然后我使用PyInstaller对其进行打包,将--add-binary ..\build\my.dll;build添加到PyInstaller调用中。 (我使用的是单目录方法,而不是一个文件。)

这很好。最终的可执行文件可以完美运行,就像原始的Python版本一样。

问题

棘手的部分是它不能在另一台PC上运行。它报告:

_main__.PyInstallerImportError: Failed to load dynlib/dll '\\path\\to\\build\\my.dll'. Most probably this dynlib/dll was not found when the application was frozen.

报告的路径正确。我什至要求Python在尝试加载DLL之前立即列出目录的内容,并且该目录在那里。

(成功的)主PC和(失败的)测试PC都是64位Windows,而DLL是64位。

我有点茫然。我也尝试过使用--hidden-exports,但是我认为对于显式--add-binary来说是多余的。我尝试通过启动新控制台并从那里运行使其在主PC上失败(以防万一我设置了一些路径但被遗忘了,或者我的venv中有些不可思议的东西,但是它每次都固执地工作!)

帮助我,所以,我错过了什么?

1 个答案:

答案 0 :(得分:0)

@MarkTolonen为我指出了正确的方向:

使用Sysinternals Process Monitor。配置它以监视python.exe进程的CreateFile操作:

我从中学到的是我的C DLL正在引用另一个 DLL,而 在测试PC上找不到。 (我以为我已经将所需的所有代码静态链接到了DLL中,但是事实证明,我只是与另一个DLL的存根库链接了。)

我想重要的细节是错误消息说“无法加载”,而不是“未能查找”。我对它的专注是后者。