pyinstaller打包
环境:win10, python 3.7.6 (32位)
注1:64位python打包可能有bug
注2:打包如果过大,可以用虚拟环境pipenv打包,可能缩小几十兆
1.安装pyinstaller
pip install pyinstaller
2.打包
可选参数 |
示例 |
说明 |
-F |
pyinstaller -F demo.py |
只在dist文件夹中生成一个程序demo.exe文件,适用于一个模块没有多依赖.py文件 |
-D |
pyinstaller -D demo.py |
默认选项,除了主程序demo.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用这个 |
-c |
pyinstaller -c demo.py |
默认选项,只对windows有效,使用控制台 |
-w |
pyinstaller -w demo.py |
只对windows有效,不使用控制台 |
-p |
pyinstaller -p D:\project\demo.py |
给生成的demo.exe文件设置一个自定义的图标 |
-i |
pyinstaller -i D:\icons\demo.ico demo.py |
给生成的demo.exe文件设置一个自定义的图标(只能ico图标) |
部分参数可组合使用,比如打包成一个.exe,不使用控制台:
pyinstaller -F -w -i 1.ico 透明.py
若64位python可能出现错误(装32位可以省略):
INTEL JKL ERROR:找不到指定的模块。
mk1_ intel_ thread. d11.Intel
]KL FATAL ERROR: Cannot load mk1_ intel_ thread. d11 .
注释掉音乐,用其他软件代替
经过网上查询还有另一种解决方法:
1.pip uninstall setuptools
2.pip install setuptools==44.0.0
(不过这种方法对setuptools进行降级处理,可能有些功能不能使用)
关于pyinstaller如何把图片,音乐,字体等素材文件也打包进exe文件中。这里就不整那些花里胡哨的东西了,直接讲讲我们该怎么做才能实现这个功能吧,先声明一下,其实这东西官网里就有教程,不明白且想明白为什么这么做的自己看官网的介绍吧:
其中透明.py是主程序,cfg.py是配置文件,resources文件夹里是一些类似字体,音乐等的素材文件。
先直接试试运行如下命令打包,生成一个spec文件:
pyi-makespec -F -w -i 1.ico 透明.py
1.打包结束后根目录变成了这样:
dist文件夹里有打包好的exe文件。打开文件夹,直接双击运行一下,会发现报错:
原因很简单,因为你没把相关的素材文件打包进这个exe文件,而在该目录下根据程序本身的设定是无法读取到这些素材文件的。你需要先把该exe文件移动到透明.py这个主程序所在的目录,然后双击运行:
想要把素材文件也打包进exe文件的话,得先修改下程序,把程序中关于素材资源加载路径的相关代码从(在cfg.py文件里):
改成:
/透明.py
if getattr(sys, 'frozen', False):
# 打包后获取路径
cur_path = sys._MEIPASS
else:
# 没有打包后获取路径
cur_path = os.path.dirname(__file__)
# 背景音乐路径
BGM_PATH = os.path.join(cur_path, 'img/z_j.mp3')
print(BGM_PATH)
# 背景图片路径
BG_IMAGE_PATH = os.path.join(cur_path, 'img/heart.png')
print(BG_IMAGE_PATH)
BG_IMAGE_PATH2 = os.path.join(cur_path, 'img/close.png')
gif_path = os.path.join(cur_path, 'img/4.gif')
可以获取exe文件里面的路径
打开透明.spec文件该文件,可以发现该文件里的内容是这样的(为了方便某些懒癌患者复制粘贴,我就不截图而是直接把内容copy下来了):
把素材都放到img文件夹和 透明.py 代码路径也一致:
pyi-makespec -F -w -i 1.ico 透明.py
wrote C:\Users\yys53\OneDrive\pack\ocr\scree_ocr.spec
now run pyinstaller.py to build the executable
带有目录的表示
透明.spec
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['透明.py'],
pathex=['C:\\Users\\yys53\\OneDrive\\pack\\520'],
binaries=[],
datas=[('C:\\Users\\yys53\\OneDrive\\pack\\520\\img', 'img')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='透明',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False , icon='1.ico')
其实就改了一行把(第十二行)datas=[]改成datas=[('C:\\Users\\yys53\\OneDrive\\pack\\520\\img', 'img')],多个文件的话[('C:\\Users\\yys53\\OneDrive\\pack\\520\\img', 'img'), ('C:\\Users\\yys53\\OneDrive\\pack\\520\\img2', 'img2'), ('C:\\Users\\yys53\\OneDrive\\pack\\520\\img3', 'img3')]
补充:linux在同目录路径,不用带图标,因为不显示
改成 datas=[('/home/yys/copy/', '/')],
就这么简单就完事了,最后在命令行运行:
pyinstaller -F 透明.spec
同样地,在dist文件夹里会生成打包好的exe文件,双击运行一下,可以发现这个exe文件竟然可以直接运行啦:
比如win10toast
应该是pyinstaller没有找到win10toast这个包
需要在..\Lib\site-packages\PyInstaller\hooks中新建一个py文件
hook-win10toast.py
内容是
from PyInstaller.utils.hooks import copy_metadata
datas = copy_metadata('win10toast')
评论列表 (0 条评论)