前言

基本上所有程序都是要打包的,想要发给别人使用,如果直接发个脚本过去,还得检查Python环境这些,相对麻烦,打包后发个执行文件(exe/app)过去就很方便了。多文件打包是现实项目中比较常用的,一般我们写个脚本啥的,都会有依赖,本文就以Windows操作系统(macOS类似)为例,记录一下自己实操的过程。


一、示例工程

本文使用pyinstaller工具进行打包。拿一个简单的pyqt项目(纯代码,无资源文件)示例。

项目根目录
原始项目根目录

'main.py',
'E:\\workspace\\ui\\ALNMainWidget.py',
'E:\\workspace\\script\\ALNMain.py',
'E:\\workspace\\script\\converter\\Converter.py'

整个项目就由这几个py文件组成,output目录 属于非代码、非资源文件,不参与打包。

二、打包

方法一 修改打包配置文件spec

1、单文件打包

首先通过单文件打包的方式,将main.py打包一次,输出main.spec文件,这个文件,其实就是打包的配置文件,我们可以修改这个文件来达到自定义打包,本文也是通过该方式,进行多文件打包。

pyinstaller -F main.py

命令执行后,对应目录发生变化,可以看到,打包配置文件main.spec已经出现
单文件打包产物

2、修改main.spec打包配置文件

原始生成的文件内容

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['main.py'],
             pathex=[],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={},
             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='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None )

由于这里要将其余的py文件也打包,所以将其余py文件的路径,也写入到 a = Analysis()的第一个数组里面去,📢注意一点,路径可以使用相对路径或绝对路径,我个人推荐绝对路径。

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['main.py',
'E:\\workspace\\ui\\ALNMainWidget.py',
'E:\\workspace\\script\\ALNMain.py',
'E:\\workspace\\script\\converter\\Converter.py'],
             pathex=[],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={},
             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='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None )

📢📢另外一个注意点:实际上应该还有很多其他配置,这里没用到 暂时不深究,后续如果有用到再补充: – 1、纯代码文件,也就是.py文件,绝对/相对路径,写到 a -> Analysis -> 第一个[]里面。

方法二 使用-D参数打包

只跑一行命令,就可生成可执行文件exe,不过目录结构跟方法一有点不同,dist -> main -> main.exe,
同时该文件夹下会生成很多依赖文件。

pyinstaller -D main.py

方法三 使用-p参数打包

注意:macOS需要使用到这种方法,来打包出.app文件。

pyinstaller -w --clean -p {依赖包路径} {入口文件}.py

总结

双系统我都实操过了,基本上差不多,不复杂,一般小项目的话,可以直接使用方法三进行打包,如果项目依赖较多,或者打包配置较多的话,建议用方法一,自定义修改配置文件的方式进行打包。

至此,已完成多个py文件打包到一个exe里面了,在dist目录下,直接运行main.exe,开启梦幻之旅!!


版权声明:本文为qq_43780851原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_43780851/article/details/123966959