**
**
**
在Windows环境下需要打包一个python项目成exe可执行文件,共有一个主函数BomSoftware.py,和一个文件夹bll;在主函数中引用了bll文件下的所有py文件,在此过程中遇到了诸多问题,所以特此记录下来,以供分享。
**
首先我们知道打包一般选用pyinstaller库来实现,安装方式CSDN上有很多详细的介绍,这里就不过多赘述。
Pyinstaller打包方式一般分为:
a、命令行方式:直接输入指令 ;
b、spec方式:通过改写spec文件的内容进行打包。
在此项目中同时使用了两种方式才打包成功,因为是自己探索并不完全正确,可能有更好的方式,欢迎大家在评论区中指出。
首先使用了命令行方式想一次性打包成功:
pyinstaller BomSoftware.py --noconsole --hidden-import PySide2.QtXml --icon="bom.ico"
简单介绍下该指令的含义:打包BomSoftware.py,取消控制台显示,导入PySide2.QtXml这个模块,设置图标。
运行成功后,在项目目录下会生成dist、build这两个文件夹以及**.spec**文件,这时运行打包好的exe文件,会报错,找不到在主函数中导入的bll模块,再尝试输入了几次不同命令行指令无果后,试着结合spec方式重新打包。
在查阅了一些资料后,对spec的内容有了大概的了解:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['BomSoftware.py',],
pathex=[],
binaries=[],
datas=[],
hiddenimports=['PySide2.QtXml'],
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,
[],
exclude_binaries=True,
name='BomSoftware',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='bom.ico',
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='BomSoftware',
)
一般需要修改的是a 和 exe 中的内容:
Analysis参数:
exe参数:
以下是在.spec文件改写后的代码:
加注释的地方为添加的语句
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
# 改写a
a = Analysis(
#添加了要打包进去的所有py文件,和主程序不在同一个路径下的py文件用绝对路径。
['BomSoftware.py',
'E:/Python/Project/Bom_Software/bll/CapacitanceToStr.py',
'E:/Python/Project/Bom_Software/bll/DealWith_.py',
'E:/Python/Project/Bom_Software/bll/DealWithTagNum.py',
'E:/Python/Project/Bom_Software/bll/Excel.py',
'E:/Python/Project/Bom_Software/bll/ResistanceToStr.py',
'E:/Python/Project/Bom_Software/bll/SpecificationIndex.py',],
# 添加项目的绝对路径 ;添加在整个项目中用到的模块路径 ;我又添加了一下python解释器的路径
pathex=['E:/Python/Project/Bom_Software',
'E:/Python/Project/Bom_Software/bll',
'E:/Python/Project/venv/Lib/site-packages'],
binaries=[],
datas=[],
# 添加在项目中隐式导入的模块'bll.Excel' 这个地方踩了坑后才发现
# 如果不添加'bll.Excel',在打包后运行会报错"ImportError 找不到指定模块",依旧无法导入不同路径下的模块
hiddenimports=['PySide2.QtXml','bll.Excel'],
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,
[],
exclude_binaries=True,
name='BomSoftware',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='bom.ico',
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='BomSoftware',
)
注意:如果打包后有报错,显示很多模块导入不成功,可以在pathex中添加项目的python解释器的路径
之后,在命令行中运行
pyinstaller BomSoftware.spec
成功运行后即可成功打包,别忘了将ui文件及图标一并放入dist\项目名下。