700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【Python学习笔记(二)】使用Pyinstaller将不同路径下的py文件打包成exe可执行文件

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

时间:2024-08-12 14:01:36

相关推荐

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

**

使用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 = Nonea = 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# 改写aa = 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\项目名下。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。