pyinstaller打包带资源文件的python项目

最近用wxpython写了一个桌面项目,准备用PyInstaller打包成.exe程序,之前尝试过用cx-freeze打包,但是由于项目中包含图片等资源文件,cx-freeze找不到理想的解决办法,于是改用PyInstaller。这里将使用过程记录下来。

安装PyInstaller

pip install pyinstaller

(如果网络太慢导致依赖安装失败,可以关掉科学上网工具)

使用方法

无资源文件打包

pyinstaller -F your_project.py

然后会生成builddist文件夹,dist文件夹下有一个.exe文件,就是程序的可执行文件。

-F 参数:生成单个.exe文件,不加的话就会生成一堆文件

有资源文件打包

首先生成your_project.spec文件

pyi-makespec -w your_project.py

-w参数:运行.exe程序不会出现dos窗口

打开your_project.spec文件:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['MainApp.py'],
             pathex=['C:\\Users\\R2D2\\Desktop\\HZXB_App'],
             binaries=[],
             datas=[],
             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,
          [],
          exclude_binaries=True,
          name='MainApp',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='MainApp')

其中datas=[]中就是要包含的资源文件的路径(‘资源路径/资源名’, ‘资源打包后相对exe的路径’),例如(在windows下操作,所以路径分隔符是双斜):

datas=[('Icons\\add.png', 'Icons'), ('Icons\\slgs.png', 'Icons') ]

spec文件修改完后,按照以上spec文件的配置执行打包命令:

pyinstaller your_project.spec

打包完成后就可以在dist\MainApp\Icons\文件夹下看到资源文件。

spec文件中exe = EXE(…)里有一项console=False,就是加了参数-w后的结果,这里应该可以手动修改(未尝试)

如果要打包的程序包含有资源文件,那么不能加-F参数,因为如果只生成单个exe文件的,资源文件是无法访问的。(解决办法应该可以将图片这些资源文件转为.py文件,未尝试)