基本步骤
- 在Pycharm中新建virtualenv环境,默认名称为venv #创建新的虚拟环境
- 在Pycharm中打开Terminal #进入命令行
- cd venv # 进入虚拟环境目录
- cd Scripts # 进入虚拟环境的Scripts文件夹中
- activate # 激活虚拟环境
- pip install pyinstaller # 安装打包工具pyinstaller
- pip install pypiwin32 # 安装打包工具相关依赖
- pip install xxx # 安装python程序中需要引入的外部包(根据自己代码需要导入的包安装)
- 将需要打包的python文件或文件夹复制到Scripts目录中(该步骤一定要执行)
- pyinstaller -D -w --icon=logo.ico xxx.py 打包
- 在当前目录下(scripts目录),生成了build和dist文件夹,打包的结果在dist中
- 把配置文件config.ini放置在dist目录下xxx目录下的_internal文件夹中(如果没有配置文件略过)。注意,我代码中使用以下语句来读取配置文件的路径。
os.path.abspath(os.path.dirname(__file__))
- 如果要取消激活虚拟环境,切换到Scripts目录下,执行deactivate
常见问题
在没有把py文件放到scripts目录的时候,我遇到了很多问题,总是提示包找不到,尝试了网上很多方法都不行。最后把py文件放在scripts下打包后正常。
如果不能确定配置文件的路径,可以在代码中通过print输出,然后pyinstaller打包时,用-c选项打包,运行时在命令行可以看到绝对路径是什么。
一段时间后再次打包出现下面问题:
和之前可以运行的版本对比,竟然是因为缺少了ffi.dll文件。把ffi.dll文件从anaconda文件夹下拷贝后放在scripts文件夹下重新打包后正常。
心得体会
最开始很排斥用venv,直到发现不同电脑,不同版本会折腾死人,才发现venv真的很好。而且这样打包,最终文件很小。