我一直试图使用PyInstaller将我的程序作为捆绑的.exe文件分发给我的同事。该程序,分析文本数据,运行完美的从我的CMD。我使用PyInstaller 3.6、Python3.7、Windows10和Anaconda3作为我的Python环境。该程序有相当多的依赖关系,包括nltk、gensim、wordcloud、sklearn、matplotlib、mpld3、seaborn、大熊猫、numpy、xlsxwriter和一些标准库。这也是一个相当长的程序,~2000行。
问题:到目前为止,我已经成功地构建了文件(作为一个文件夹和一个文件包)。为了测试.exe文件是否工作,我从CMD运行它。一切都进行得很顺利(我的导入和函数运行正常,被提示输入包含文本数据的Excel文件的名称,文本被清理等等),但它突然终止,没有任何警告或错误消息,在一行使用Gensim的SparseTermSimilarityMatrix函数。我试着注释掉这一行,它在下一行结束,同样没有任何消息。
我正在使用一个.exe文件构建.spec文件(这样我就可以将数据文件添加到我的包和几个隐藏导入中,以克服错误)。对于造成此问题的原因,我唯一的指示是在构建时有关缺少DLL的警告:
108890 INFO: Looking for dynamic libraries
109047 WARNING: lib not found: msmpi.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_blacs_msmpi_lp64.dll
109293 WARNING: lib not found: impi.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_blacs_intelmpi_lp64.dll
109304 WARNING: lib not found: impi.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_blacs_intelmpi_ilp64.dll
109704 WARNING: lib not found: mpich2mpi.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_blacs_mpich2_lp64.dll
109754 WARNING: lib not found: pgc14.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_pgi_thread.dll
109757 WARNING: lib not found: pgf90rtl.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_pgi_thread.dll
109761 WARNING: lib not found: pgf90.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_pgi_thread.dll
110120 WARNING: lib not found: msmpi.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_blacs_msmpi_ilp64.dll
110164 WARNING: lib not found: mpich2mpi.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Library\bin\mkl_blacs_mpich2_ilp64.dll
112452 WARNING: lib not found: icuuc53.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Scripts\Qt5Core.dll
112459 WARNING: lib not found: icuin53.dll dependency of C:\Users\username\anaconda3\envs\pyexe\Scripts\Qt5Core.dll如果有人能解释一下::,我将非常感激
1.为什么PyInstaller构建的.exe文件可能在没有错误消息的情况下提前终止?
2.如何处理丢失的DLL(实际上在我的计算机上找不到)?
更新:如果我第一次激活conda环境, .exe文件将成功地从CMD运行!然而,这违背了独立发行版的目的。
发布于 2020-06-29 13:41:04
在实现了.exe文件成功地从我的CMD运行之后,如果我第一次激活我的anaconda环境,下面是我的原始解决方案,它只适合于一个文件夹包:
在我的anaconda环境的根目录中,我搜索了所有的"dll“文件(它返回了很多)。我将搜索返回的所有DLL文件复制到包的"dist“文件夹,跳过重复文件。
.exe文件不再提前终止,工作非常完美!
似乎我收到的关于在构建时丢失DLL的警告是误导的-引用的DLL文件仍然不在我的计算机上。
解决方案更新:在手动将所有DLL文件从我的anaconda环境复制到我的包的dist文件夹之后,我尝试删除我手动添加的每个DLL文件,并测试.exe文件是否仍能像以前一样工作或终止。--它归结为一个DLL文件: libiomp5md.dll --这实际上是缺少的链接!因此,我建议:
datas=[('libiomp5md.dll', '.')]
我希望这能帮助任何面临类似DLL相关问题的人。
https://stackoverflow.com/questions/62625517
复制相似问题