首先先看下整个工程路径
lib是依赖库,main.py文件引用了lib中的文件。
现在以main.py为程序入口(生成main.exe)进行打包。
使用 cd 进入test_one文件夹:
其中“dir”命令可以显示出当前文件夹下的文件情况。
进入到test_one之后,运行:
pyi-makespec -F -w main.py
此时会生成一个main.spec文件
双击进入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=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
为了将lib中的文件也一起打包,需要改写spec文件,改写的过程中,对路径进行了处理,并且也将无法打包的第三方库进行了处理。注意data=[]中的文件写法,(“文件路径”,‘.’)是一个整体。
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['main.py'],
pathex=[(r'E:\Project\examp\script\test_one\main.py')],
binaries=[],
datas=[ (r'E:\Project\examp\lib\a.py', '.'),
(r'E:\Project\examp\lib\b.py', '.'),
(r'E:\Project\examp\lib\c.py', '.'),],
hiddenimports=["crcmod","decimal","serial", "modbus_tk.modbus_rtu",],
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=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
改写完成后,运行
pyinstaller main.spec
会在test_one文件下生成 文件夹build 和文件夹dist,其中dist下的main.exe则是我们需要的执行文件。双击可运行。
双击运行报错的话,可以观察是不是缺少第三方库,如果双击后的黑窗口一闪而过,可以用win+shift+r 进行录屏。