环境:win10, python 3.7.6 (32位)

注1:64位python打包可能有bug

注2:打包如果过大,可以用虚拟环境pipenv打包,可能缩小几十兆

1. 普通打包

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进行降级处理,可能有些功能不能使用)

 

2.  带图片音乐等pyinstaller打包

关于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文件竟然可以直接运行啦:

3.一些库不能打包解决办法

比如win10toast

 

应该是pyinstaller没有找到win10toast这个包

需要在..\Lib\site-packages\PyInstaller\hooks中新建一个py文件

hook-win10toast.py

内容是

from PyInstaller.utils.hooks import copy_metadata

datas = copy_metadata('win10toast')