用python写了一个线性规划求解问题的小程序。程序用到了numpy、pandas、scipy和pyqt5。为了在没有python环境的电脑下运行程序,用pyinstaller将写好的程序打包成.exe可执行文件。
dll
文件pip
无法安装到创建的虚拟环境下pyinstaller
打包好的代码缺少依赖文件pyinstaller
打包好的代码过大bat
文件进行打包过程的批量处理```bash Anaconda python 3.8.11 numpy 1.20.3 scipy 1.6.2 pandas 1.3.2 PyQt 5.9.2 ```
问题
在开发环境的电脑上打包好后,打开cmd
执行main.exe
,提示错误缺少mkl_intel_thread.1.dll
,从Anaconda
目录下搜索该文件拷贝到main.exe
同目录下,再次执行main.exe
不再报错
本以为问题已经顺利解决,但是把打包好的文件拷贝到一台没有python环境的电脑上打开后不报错闪退,或是用cmd
执行main.exe
则出现“程序无响应”但窗口仍然没有任何错误提示信息。对代码逐行排查后发现是import numpy as np
语句导致的程序退出。结合上述遇到的mkl_intel_thread.1.dll
导致问题,怀疑是将dll
文件拷贝到文件夹下后无法被正确执行。
解决
查找资料发现conda install numpy
会自动下载带mkl
加速版本的numpy
,而pip install numpy
下载的则不带。因此考虑numpy
的版本。
首先创建一个新的conda
虚拟环境:
conda create -n pyqt5
切换到创建的虚拟环境
conda activate pyqt5
在环境中安装所需库
conda install pyinstaller conda install pyqt
用pip
安装剩余库,这里又存在一个问题。虽然切换到了虚拟环境pyqt5
,但是使用pip install
仍然会安装到原始环境下。一个简单解决办法是cd
到D:\Anaconda3\envs\pyqt5
目录下,再执行pip install
。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scipy
最后确认你的cmd
处于pyqt5
虚拟环境下,执行
pyinstaller -D -w --distpath .\exe\dist --workpath .\exe\build --clean main.py --icon=.\icon\exeicon.ico --hidden-import scipy.spatial.transform._rotation_groups
-D
指明打包文件用多文件的方式保存,这里也是一个坑,如果用-F
单文件存储的话很容易出现缺少依赖文件等问题。-D
的兼容性更好。
-w
指明运行文件隐藏终端显示。
这种方式打包好的程序已经无需mkl
文件的依赖支持,将其拷贝到无python环境的电脑下顺利运行。
pyinstaller
打包好的代码过大bat
文件进行打包过程的批量处理json
文件进行数据存储,每次打包好都要手动将这些文件复制到目录下很麻烦,因此写了一个.bat
文件对打包过程进行批处理。@echo off call conda activate pyqt5 call pyinstaller -D -w --distpath .\exe\dist --workpath .\exe\build --clean main.py --icon=.\icon\exeicon.ico --hidden-import scipy.spatial.transform._rotation_groups call echo d | xcopy /S /Y "./json" "./exe/dist/main/json" call echo d | xcopy /S /Y "./icon" "./exe/dist/main/icon"双击
.bat
文件可以实现自动切换虚拟环境、打包程序、复制文件夹到打包目录下