Python——第三方扩展库 之 使用 Pyinstaller 模块实现【Python代码打包成系统可执行文件】 Pyinstaller 模块Pyinstaller 模块的基本使用常见问题以及解决方案问题1无法将“pyinstaller”项识别为...1.查看是否下载了pyinstaller包2.查看已下载的第三方扩展库所在路径找到一个名称为Scripts的文件夹3.复制Scripts路径并添加环境变量问题2报错Fatal error in launcher: Unable to create process using Python解释器路径 敲入的Pyinstaller命令问题3Shell窗口一闪而过而不是停留问题4打包出来的.exe文件过大问题的根源虚拟环境虚拟环境管理工具 pipenvPipfile 和 Pipfile.lock 文件pipenv常用命令Pyinstaller 模块的基本使用可执行文件指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下可执行程序的呈现方式不一样这类文件可以单独运行在windows操作系统下可执行程序可以是 .exe文件 .sys文件 .com等类型文件基本介绍Pyinstaller为一种命令行工具不需要进入Python程序中编写代码只需要打开cmd命令窗口输入简短的指令即可实现功能Pyinstaller 模块的作用Pyinstaller可以将Python程序以及所有的依赖库打包成为各种平台上的可执行文件可以使Python程序脱离解析器运行能防止源代码泄漏打包的时候已经把解析器给封装进去了使用方式由于要将路径指引到Python文件所在的路径下于是可以在要被转化为可执行文件的Python程序文件扩展名为.py的所在位置的空白区域同时摁住鼠标右键和shift键会弹出对话框选择在此处打开Powershellcmd窗口就会弹出cmd命令窗口这样就会自动锁定文件所在的路径接下来就可以运行下面的代码实现.exe可执行文件的转化pyinstaller-F 要被转化为可执行文件的Python程序的文件名#比如文件为amazing.py则填入amazing.py注意扩展名也要写入对应该Python程序生成的可执行文件就在distdistribute文件夹中进行打包的同时可以指定生成的可执行文件的图标pyinstaller-i 作为图标的图片文件名-F 要被转化为可执行文件的Python程序的文件名#要将图标文件和.py文件放在同一个目录下尽量都使用 英文 进行文件命名进行打包的同时可以指定生成的可执行文件的文件名缺省即为.py文件的名称pyinstaller-F 要被转化为可执行文件的Python程序的文件名-n 要修改成的文件名进行打包的同时可以指定输出的文件路径pyinstaller-F 要被转化为可执行文件的Python程序的文件名--distpath 指定的路径#注意--distpath中具有两个-命令不要打错了假如程序逻辑中需要依赖一些文件但pyinstaller并不会将自动把这些文件帮你打包进去比如一个第三方库中有一段程序需要去使用public.xml文件当打包完成后这个文件是不会自动打包进去的pyinstaller为我们提供了参数配置文件也就是上面成功打包指定.py文件后生成的.spec文件我们只需要在.spec文件的datas中配置需要打包的文件路径即可。例如下面这个datas的修改表示的是将public.xml文件打包到androguard\core\resources目录下datas[(D:\\python3.6.5\\Lib\\site-packages\\androguard\\core\\resources\\public.xml,androguard\\core\\resources)这样修改后我们就可以使用下面这个命令进行再次打包打包完成后打开软件发现需要用到依赖文件已经成功打包相关功能正常pyinstaller-D xxx.spec对于图形界面的应用进行打包的同时可以指定可执行文件运行时不出现shell小黑框pyinstaller-w -w就是取消shell窗口的显示pyinstaller常用参数参考博客-F,–onefile 打包一个单个文件如果你的代码都写在一个.py文件的话可以用这个如果是多个.py文件就别用-D,–onedir 打包多个文件在dist中生成很多依赖文件适合以框架形式编写工具代码我个人比较推荐这样代码易于维护-K,–tk 在部署时包含 TCL/TK-a,–ascii不包含编码.在支持Unicode的python版本上默认包含所有的编码.-d,–debug 产生debug版本的可执行文件-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)-c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)pyinstaller-c xxxx.py pyinstaller xxxx.py--console-s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.-X,–upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)-o DIR,–outDIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.-p DIR,–pathDIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径让pyinstaller自己去找程序需要的资源 –icon将file.ico添加为可执行文件的资源(只对Windows系统有效)改变程序的图标 pyinstaller-i ico路径 xxxxx.py –icon将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)-v FILE,–versionFILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)-n NAME,–nameNAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字常见问题以及解决方案问题1无法将“pyinstaller”项识别为…有的时候可能在运行过程中会出现这种错误无法将“pyinstaller”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写如果包括路径请确保路径正确然后再试一次此时的解决方法1.查看是否下载了pyinstaller包如果没有请使用该命令进行pyinstaller第三方扩展库的下载pip install pyinstaller-i https://pypi.tuna.tsinghua.edu.cn/simple2.查看已下载的第三方扩展库所在路径找到一个名称为Scripts的文件夹如果是使用VS的同学大概率按照下面这个路径继续往下找会碰到这个Scripts文件夹因为我自己的文件夹的路径是C:\Users\Administrator\AppData\Local\Programs\Python\Python39下面C:\Users\Administrator\AppData\Local\Programs\Python如果是使用Pycharm的同学可以先在Pycharm进入这个界面先查看已下载的第三方扩展库所在路径接着根据这个路径去找大概率也可以遇到这个Scripts文件夹值得注意的一点是这个AppData文件夹默认是隐藏掉的需要进行一下操作来进行显示3.复制Scripts路径并添加环境变量在Windows 上添加全局环境变量的步骤1 搜索并选择系统“控制面板”2 单击高级系统设置链接然后单击环境变量3 选择Path点击编辑窗口中输入环境变量的值即Scripts路径然后单击确定即可我们要修改的是Path这个用户变量点击编辑再点击新建添加Scripts路径即可或许点击编辑以后不会出现和我相同的界面而是弹出一个下面这样的界面此时要添加添加Scripts路径就是在原来变量值的基础上后面添加英文分号;再粘贴上Scripts路径即可问题2报错Fatal error in launcher: Unable to create process using “Python解释器路径” “敲入的Pyinstaller命令”此时可能是该电脑上的python解释器安装了多个然后使用了错误的python解释器路径这种问题的临时解决方案是1.找到安装了Pyinstaller模块的python解释器路径2.直接在cmd命令行中采用以下方式解决命令形式python解释器绝对路径-m Pyinstaller 原Pyinstaller命令参数 案例D:\PyCharm\Python\Python39\python.exe-m PyInstaller-F main_QQmail.py问题3Shell窗口一闪而过而不是停留可能有同学需要在运行可执行文件的过程中Shell窗口停留一阵子同时发现在运行我们Pyinstaller 模块生成的可执行文件的过程中发现Shell窗口一闪而过了这个时候可以在Python代码的最后添加上os.system(‘pause’)需要先导入os标准库再去生成可执行文件即可实现Shell窗口停留的功能问题4打包出来的.exe文件过大问题的根源打包会将很多没有用到的模块打包进去最终导致exe文件特别大虚拟环境所谓的虚拟环境就是给这个项目单独配置一个新的纯净的python环境。通过创建一个虚拟环境可以避免环境中包含多余的包当然你也可以通过在原本环境中直接 pip uninstall 卸载掉多余的包但不建议这么做毕竟其它项目还得做后面还得 pip install 下载回来虚拟环境不仅仅可以用于解决使用 Pyinstaller 模块打包出来的.exe文件过大的问题还可以用于解决多个项目依赖不同版本第三方工具的问题例如应用程序A需要特定模块的 1.0 版本但应用程序B需要该模块的 2.0 版本当我们在A和B应用程序间切换时需要不断检测、卸载、安装该模块。这意味着只安装一个版本的模块可能无法满足每个应用程序的要求因此需要创建虚拟环境来将 A、B 应用程序所需的第三方工具包分隔开来虚拟环境管理工具 pipenv常见的 Python 虚拟环境管理工具有 virtualenv、virtualenvwrapper、pipenv、conda 等其中比较推荐的是 pipenvpipenv是requests作者的一个项目, 整合了virtualenv, pip的优点用于更方便地为项目建立虚拟环境并管理虚拟环境中的第三方模块pipenv 是 Python 的一个第三方库包含创建虚拟环境和安装包依赖的功能其语法与 pip 很相似是 pip 和 virtualenv 的组合体它基于 Pipfile 的依赖记录方式用于替代旧的记录方式requirements.txt利用 pipenv 初始化好虚拟环境后会在项目目录下生成2个文件分别为 Pipfile 和 Pipfile.lock。为 pipenv 包的配置文件代替原来的 requirement.txt能够自动管理虚拟环境和依赖文件并提供一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作pipenv开源之后在GitHub上有很高人气pipenv 的安装依赖于 pip如果没有配置和安装好 pip需要先安装 pip。如果系统中是 Python 3那么可以直接使用 pip3 进行安装pip3 install pipenv-i https://pypi.tuna.tsinghua.edu.cn/simple/Pipfile 和 Pipfile.lock 文件pipenv 使用 Pipfile 代替 requirement.txt 文件来记录 Python 第三方工具的信息另外增加 Pipfile.lock 文件来锁定 Python 第三方工具的包名、版本和依赖关系的列表Pipfile 文件Pipfile 文件用来记录新创建的虚拟环境信息。如果在当前目录下存在之前的 Pipfile 文件新的 Pipfile 文件会将其覆盖Pipfile 文件主要用来配置项目依赖的第三方工具对应文件中的packages、工具包的镜像源对应文件中的source包的安装镜像源一般使用国内的镜像来加快下载速度如果版本信息使用*代替那么表示安装的是该第三方包的最新稳定版本、Python 解释器的版本对应文件中的requires等Pipfile.lock 文件Pipfile.lock 文件是通过哈希算法将包的名称、版本和依赖关系生成哈希值Pipfile.lock 文件记录了所有包和子包的明确版本以完成确定的构建可以保证包的完整性锁定 Python 版本便于以后项目发布使用固定的包在正常情况下Pipfile.lock 文件不会自动更新第三方工具的版本例如安装的 requests 库一开始是 2.26.0 版本后来指定安装 2.25.1 版本那么 Pipfile 文件会更新但是 Pipfile.lock 文件不会更新只有手动执行 pipenv lock 命令生成 Pipfile.lock 文件后才会更新Pipfile.lock 文件保存了包的哈希值这是确保生产环境和开发环境包信息一致的关键。当我们把项目从开发环境复制到生产环境我们只需要把代码、Pipfile 文件和 Pipfile.lock 文件放到生产环境并执行 pipenv install 一条命令就可以创建和开发环境一样的环境了而无须重新安装之前在开发环境中安装的包这很省心使用–skip-lock参数跳过锁定过程安装时忽略 Pipfile.lock锁定过程会比较费时可以等真正完成项目开发要提交到仓库时再去锁定pipenv常用命令pipenv命令解释pipenv install创建虚拟环境pipenv install --python 3.6 或 pipenv install --python /usr/local/Python-3.9.8/bin/python3创建虚拟环境并指定创建的虚拟环境的Python版本如果不指定Python不变那么为本地默认版本pipenv graph查看当前安装的第三方工具包的依赖关系图pipenv shell激活虚拟环境pipenv --version显示版本信息pipenv --py显示虚拟环境下Python解释器所在路径pipenv --venv显示虚拟环境下实际文件所在路径pipenv --rm删除虚拟环境pipenv install 第三方模块名版本号使用pipenv工具安装指定版本的第三方扩展库并添加到 Pipfilepipenv install 第三方模块名版本号 -i https://pypi.tuna.tsinghua.edu.cn/simple使用pipenv工具安装扩展库时可以使用-i选项指定从国内服务器上下载和安装从而实现速度大幅度提高pipenv install --skip-lock 第三方模块名版本号使用pipenv工具安装指定版本的第三方扩展库并添加到 Pipfile并在安装时忽略 Pipfile.lock以加快下载进度pipenv update 第三方模块名使用pipenv工具更新第三方扩展库pipenv run pip list / pipenv run python查看在虚拟环境中已经安装的包 / 运行虚拟环境中Python解释器与先pipenv shell进入虚拟环境再敲pip list / python的效果相同exit退出虚拟环境