在学《Leanrn Python the Hard Way》时做了一个文字游戏,想要分享给朋友玩。于是便想把程序打包成 .exe 文件,尝试了py2exe,出了很多问题,花了很多时间查来查去最后还是没有成功。然后试了pyinstaller,虽然也遇到了一些问题,但终于完成了。
(英文好的建议直接去看官方文档)
一、安装及基本操作
Pyinstaller可以使用pip安装,在命令行下输入下面这行就可以了。
pip install pyinstaller
如果下载安装包,那么要注意下载相应的win32/64版本,建议所有的程序都统一成32位或是64位版本,这样会减少很多问题。
安装完毕之后,就可以通过以下命令打包了
先转到主脚本所在的地址,例如:
cd C:UsersAdministratorprojectstomato
然后执行如下命令:
pyinstaller start.py -F
其中start.py为主脚本,主脚本中调用的模块文件会被自动打包。第三个参数是操作命令,常用的命令有
-F 打包成单个文件 -D 打包成单个文件夹形式 -c 控制台模式,执行程序会跳出控制台, -w 窗口模式,不会跳出控制台
基础的命令就这些,程序名和图标等建议在spec文件中设置。
二、文件调用(音频,图片等)
一开始打包时便不清楚文件调用问题,因此文件一旦移动到别处就没法正常调用。后来看到别人的教程,但这部分也是模棱两可,让人理解不了。后来结合官方文档和别人的教程,终于弄清楚了。
首先在脚本定义一个读取相对路径的函数:
Import os
Import sys
def resource_path(relative_path):
"""
定义一个读取相对路径的函数
"""
if hasattr(sys, "_MEIPASS"):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
然后在需要调用文件的地方用如下格式包裹:
resource_path('resources/complete.wav')
然后在生成的.spec文件exe = EXE()中加入下面这行:
[('resources/complete.wav',r'C:UsersAdministratorresourcescomplete.wav','music'),],
元组内的三个项:
第一个为代码中resource_path包裹的地址;
第二个是文件的实际地址;
第三个是打包进程序的文件名字。
这样打包后文件会被正确引用。
如下所示:
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[('resources/complete.wav',r'C:UsersAdministratorprojectsDiaryresourcescomplete.wav','music'),],
name='Diary', # 这里可以设置可执行文件的名字
icon='diary.ico',# 设置图标
debug=False,
strip=None,
upx=True,
console=True ) # 是否开启控制台模式
注意加地址前的r以及行尾的逗号,更新过spec文件后,再重新打包只需要执行pyinstaller start.spec 就可以了。
三、添加图标
图标的设置有两种方式,一种是在执行打包命令时加入下面这句:
--icon=xxx.ico
第二种(推荐)是用文本编辑器或记事本打开执行打包后文件夹内新生成的xxx.spec文件,然后在exe =()中加入一行:
icon = ’xxx.ico‘
(见上面的代码第八行)
xxx.ico 为你要设置的图标文件,其他格式需要转换成ico格式,可在这里在线转换。
(图标文件要放在程序根目录下)
四、其他
- 64位windows上打包的程序不能在32位上运行,反之却可以。
- 每次更改完代码或是spec文件,只需要再重新执行一下pyinsyaller start.spec -F就可以了
五、替代品
如果pyinstaller没有解决你的问题,那么你可以尝试一下下面这两个替代品: