您现在的位置是:网站首页> 编程资料编程资料
关于pyinstaller 打包多个py文件的问题_python_
2023-05-26
1001人已围观
简介 关于pyinstaller 打包多个py文件的问题_python_
安装pyinstall
pip install pyinstaller
注意事项
除非必要,否则尽量不要直接import module,用from xxx import xxx来代替,减少打包需要加载的模块,
缩减最终的exe体积
参数详解
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME] [--add-data] [--add-binary ] [-p DIR] [--hidden-import MODULENAME] [--additional-hooks-dir HOOKSPATH] [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES] [--key KEY] [-d {all,imports,bootloader,noarchive}] [-s] [--noupx] [--upx-exclude FILE] [-c] [-w] [-i ] [--version-file FILE] [-m ] [-r RESOURCE] [--uac-admin] [--uac-uiaccess] [--win-private-assemblies] [--win-no-prefer-redirects] [--osx-bundle-identifier BUNDLE_IDENTIFIER] [--runtime-tmpdir PATH] [--bootloader-ignore-signals] [--distpath DIR] [--workpath WORKPATH] [-y] [--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL] scriptname [scriptname ...]
positional arguments:
scriptname
要处理的脚本文件的名称或正好一个.spec文件。 如果指定了.spec文件,则大多数选项是不必要的,将被忽略。
可选参数:
-h,--help显示此帮助消息并退出
-v,--version显示程序版本信息并退出。
--distpath DIR放置捆绑的应用程序的位置(默认值:。\ dist)
--workpath WORKPATH将所有临时工作文件,.log,.pyz放在哪里
等(默认值:。\ build)
-y,--noconfirm替换输出目录(默认值:
SPECPATH \ dist \ SPECNAME)而不要求
确认
--upx-dir UPX_DIR UPX实用程序的路径(默认值:搜索执行)
路径)
-a,-ascii不包括unicode编码支持(默认值:
包括(如果有)
--clean清理PyInstaller缓存并删除临时文件
在建造之前。
--log-level LEVEL生成时控制台消息中的详细信息量。水平
可能是TRACE,DEBUG,INFO,WARN,ERROR,
严重(默认:INFO)。
产生什么:
-D,--onedir创建一个包含可执行文件的单文件夹捆绑包
(默认)
-F,--onefile创建一个文件捆绑的可执行文件。
--specpath DIR文件夹,用于存储生成的规范文件(默认值:
当前目录)
-n NAME,--name NAME分配给捆绑的应用程序和规范文件的名称
(默认值:第一个脚本的基本名称)
捆绑内容,搜索位置:
--add-data
要添加到的其他非二进制文件或文件夹
可执行文件。路径分隔符是平台
特定的`os.pathsep``(在Windows上是``;``
和``:``在大多数Unix系统上)。这个选项
可以多次使用。
--add-binary
要添加到可执行文件的其他二进制文件。
有关更多详细信息,请参见--add-data选项。这个
该选项可以多次使用。
-p DIR,--paths DIR搜索导入的路径(例如使用PYTHONPATH)。
允许使用多个路径,以“;”分隔,或使用
此选项多次
--hidden-import MODULENAME,-hiddenimport MODULENAME
命名在代码中不可见的导入
脚本。此选项可以多次使用。
--additional-hooks-dir HOOKSPATH
搜索钩子的其他路径。这个选项
可以多次使用。
--runtime-hook RUNTIME_HOOKS
定制运行时挂钩文件的路径。运行时挂钩是
与可执行文件捆绑在一起的代码是
在设置任何其他代码或模块之前执行
运行时环境的特殊功能。这个
该选项可以多次使用。
--exclude-module排除
可选模块或软件包(Python名称,而不是
路径名称)将被忽略(好像不是)
找到)。此选项可以多次使用。
--key KEY用于加密Python字节码的密钥。
如何产生:
-d {all,imports,bootloader,noarchive},--debug {all,imports,bootloader,noarchive}
提供调试冻结的协助
应用。可以多次提供此参数
选择以下几个选项的时间。
-全部:以下所有三个选项。
-导入:为基础指定-v选项
Python解释器,导致其打印消息
每次模块初始化时,显示
来源(文件名或内置模块)
已加载。看到
https://docs.python.org/3/using/cmdline.html#id4。
-自举程序:告诉自举程序发出进度
初始化并启动
捆绑的应用。用于诊断问题
缺少进口。
-存档:而不是存储所有冻结的Python
源文件作为结果中的存档
可执行文件,将它们存储为文件
输出目录。
-s,--strip将符号表条应用于可执行文件并
共享库
pyinstaller最佳使用方式
常用的命令为
pyinstall -i xxx.ico -n xxx -w -D main.py
其中 -D 参数或 -F 参数后面跟的是入口文件,即你 python xxx.py 运行程序时这个xxx.py文件
对应依赖比较多的程序,建议使用 -D, -F更适合单文件的py脚本。
pyinstaller 打包其实分两步走
第一步,通过上面的命令执行打包,此时会生成相应的spec文件
大体流程如下:
1、在脚本目录生成 xxx.spec 文件(看-n参数,没传,则与xxx.py同名为xxx);
2、创建一个 build 目录;
3、写入一些日志文件和中间流程文件到 build 目录;
4、创建 dist 目录;
5、生成可执行文件或文件夹到 dist 目录;
效果如下:

第一步完成后,获得xxx.spec,然后再执行
第二步:对xxx.spec文件执行pyinstaller 指令
pyinstaller xxx.spec
完成打包
进入dist中打包好的文件夹后,双脚运行可执行文件则可
这是一个利用tkinter构建界面的简单程序
spec文件解析
一个spec文件的例子。
block_cipher =None a =Analysis(['minimal.py'], pathex=['/Developer/PItests/minimal'], binaries=None, datas=None, hiddenimports=[], hookspath=None, runtime_hooks=None, excludes=None, ciper=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz,...) coll = COLLECT(...)
spec文件中主要包含4个class: Analysis, PYZ, EXE 和 COLLECT.
- Analysis以py文件为输入,它会分析py文件的依赖模块,并生成相应的信息
- PYZ是一个.pyz的压缩包,包含程序运行需要的所有依赖
- EXE根据上面两项生成
- COLLECT生成其他部分的输出文件夹,COLLECT也可以没有
手动修改spec文件
有时候PyInstaller自动生成的spec文件并不能满足我们的需求,最常见的情况就是我们的程序依赖我们本地的一些数据文件,这个时候就需要我们自己去编辑spec文件来添加数据文件了。 上面的spec文件解析中Analysis中的datas就是要添加到项目中的数据文件,我们可以编辑datas.
a =Analysis( ... datas =[('you/source/file/path','file_name_in_project'), ('source/file2','file_name2')] ... ) 可以认为datas是一个List,每个元素是一个二元组。元组的第一个元素是你本地文件索引,第二个元素是拷贝到项目中之后的文件名字。除了上面那种写法,也可以将其提出来。
added_files =[...] a =Analysis( ... datas = added_files, ... )
笔记: pyinstaller的常见问题
到此为止pyinstaller的知识已经大致了解,但是并没有解决是实操时, 主py文件调用其他py文件(自定义的)时,无法找到该模块的问题。如下图:

尝试解决1:
根据下面网友经验,在spec文件中加入根目录:
... a = Analysis(['test1.py'], pathex=['D:\Python_X64\dynamic_positioning'], # 加入根目录,且text2.py也在该目录中 binaries=[], datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) ... 尝试解决1,测试结果:
记过如上修改,问题重要解决。程序不再报错,并且正常运行。
以下上是给我启发的网友的操作方式,记录并感谢
实验项目结构
在sampleproject目录下执行tree /f 查看文件结构

pyinstaller -F -c simple.py -p __init__.py -p test_install.py
打包多个py文件的命令
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模块1] --hidden-import [自建模块2]
其中sample.py是主程序入口文件,其他.py文件是自建模块(test_install.py)。所以在执行下面命令:
pyinstaller -F -c simple.py -p __init__.py -p test_install.py
执行完成后会产生2个文件夹build,dist和一个文件simple.spec

进入exe目录并成功执行exe程序

OK 这样就完成了打包的程序,事实上,我并不是这么顺利,中间也遇到些问题
遇到的问题
Failed to execute script ‘simple’ due to unhandled exception!
首先看下py文件的内容,内容瞎写的,只是为了测试!!!
test_install.py 文件 def install_test(): print('install tes
相关内容
- 基于opencv对高空拍摄视频消抖处理方法_python_
- 详解Python如何轻松实现定时执行任务_python_
- Python Django教程之实现天气应用程序_python_
- Python利用yarl实现轻松操作url_python_
- Python fire模块(最简化命令行生成工具)的使用教程详解_python_
- Django中prefetch_related()函数优化实战指南_python_
- Python/JS实现常见加密算法的示例代码_python_
- python argparse 模块命令行参数用法及说明_python_
- Django中QuerySet查询优化之prefetch_related详解_python_
- 时间序列分析之ARIMA模型预测餐厅销量_python_
点击排行
本栏推荐
