序言
我构建了一个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中有些不可思议的东西,但是它每次都固执地工作!)
帮助我,所以,我错过了什么?
答案 0 :(得分:0)
@MarkTolonen为我指出了正确的方向:
使用Sysinternals Process Monitor。配置它以监视
python.exe
进程的CreateFile
操作:
我从中学到的是我的C DLL正在引用另一个 DLL,而 在测试PC上找不到。 (我以为我已经将所需的所有代码静态链接到了DLL中,但是事实证明,我只是与另一个DLL的存根库链接了。)
我想重要的细节是错误消息说“无法加载”,而不是“未能查找”。我对它的专注是后者。