**
使用Pyinstaller将不同路径下的py文件打包成exe可执行文件
**
**
前言:
在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 : Analysis类的实例,要求传入各种脚本用于分析程序的导入和依赖。
- pyz :PYZ的实例,是一个.pyz文件,包含了所有pure中的所有Python模块。
- exe :EXE类的实例,这个类是用来处理Analysis和PYZ的结果的,也是用来生成最后的exe可执行程序。
- coll : COLLECT类的实例,用于创建输出目录。
- block_cipher : 加密密钥。
一般需要修改的是a 和 exe 中的内容:
Analysis参数:
- scripts : 也是第一个参数,它是一个脚本列表,可以传入多个py脚本;
- pathex :默认有一个spec的目录,当我们的一些模块不在这个路径下,记得把用到的模块的路径添加到这个list变量里;
- datas :作用是将本地文件打包时拷贝到目标路径下;
- binaries :添加二进制文件,也是一个列表,定义方式与datas参数一样;
- hiddenimports :指定脚本中需要隐式导入的模块;
- hookspath :指定额外hook文件(可以是py文件)的查找路径,这些文件的作用是在PyInstaller运行时改变一些Python或者其他库原有的函数或者变量的执行逻辑(并不会改变这些库本身的代码);
- runtime_hooks :指定自定义的运行时hook文件路径(可以是py文件);
- excludes :指定可以被忽略的可选的模块或包。
exe参数:
- console :设置是否显示命令行窗口,同命令-w/-c。
- icon :设置程序图标,默认spec是没有的,需要手动添加,参数值就是图片路径的字符串。同命令“命令-i/–icon”。
以下是在.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',
)
之后,在命令行中运行
pyinstaller BomSoftware.spec
成功运行后即可成功打包,别忘了将ui文件及图标一并放入dist\项目名下。
本文含有隐藏内容,请 开通VIP 后查看