【Python学习笔记(二)】使用Pyinstaller将不同路径下的py文件打包成exe可执行文件

**

使用Pyinstaller将不同路径下的py文件打包成exe可执行文件

**
**

前言

在Windows环境下需要打包一个python项目成exe可执行文件,共有一个主函数BomSoftware.py,和一个文件夹bll;在主函数中引用了bll文件下的所有py文件,在此过程中遇到了诸多问题,所以特此记录下来,以供分享。
【Python学习笔记(二)】使用Pyinstaller将不同路径下的py文件打包成exe可执行文件_第1张图片

**

正文

首先我们知道打包一般选用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',
)

  1. a : Analysis类的实例,要求传入各种脚本用于分析程序的导入和依赖。
  2. pyz :PYZ的实例,是一个.pyz文件,包含了所有pure中的所有Python模块。
  3. exe :EXE类的实例,这个类是用来处理Analysis和PYZ的结果的,也是用来生成最后的exe可执行程序。
  4. coll : COLLECT类的实例,用于创建输出目录。
  5. block_cipher : 加密密钥。

一般需要修改的是a 和 exe 中的内容:

Analysis参数:

  1. scripts : 也是第一个参数,它是一个脚本列表,可以传入多个py脚本;
  2. pathex :默认有一个spec的目录,当我们的一些模块不在这个路径下,记得把用到的模块的路径添加到这个list变量里;
  3. datas :作用是将本地文件打包时拷贝到目标路径下;
  4. binaries :添加二进制文件,也是一个列表,定义方式与datas参数一样;
  5. hiddenimports :指定脚本中需要隐式导入的模块;
  6. hookspath :指定额外hook文件(可以是py文件)的查找路径,这些文件的作用是在PyInstaller运行时改变一些Python或者其他库原有的函数或者变量的执行逻辑(并不会改变这些库本身的代码);
  7. runtime_hooks :指定自定义的运行时hook文件路径(可以是py文件);
  8. excludes :指定可以被忽略的可选的模块或包。

exe参数:

  1. console :设置是否显示命令行窗口,同命令-w/-c。
  2. 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',
)

注意:如果打包后有报错,显示很多模块导入不成功,可以在pathex中添加项目的python解释器的路径
之后,在命令行中运行

pyinstaller BomSoftware.spec

成功运行后即可成功打包,别忘了将ui文件及图标一并放入dist\项目名下。

你可能感兴趣的:(Python学习笔记,python,pyqt,学习)