Python——第三方扩展库 之 使用 Pyinstaller 模块实现【Python代码打包成系统可执行文件】

Pyinstaller 模块的基本使用

可执行文件:指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样,这类文件可以单独运行,在windows操作系统下,可执行程序可以是 .exe文件 .sys文件 .com等类型文件

基本介绍:Pyinstaller为一种命令行工具,不需要进入Python程序中编写代码,只需要打开cmd命令窗口,输入简短的指令即可实现功能

Pyinstaller 模块的作用:Pyinstaller可以将Python程序以及所有的依赖库打包成为各种平台上的可执行文件,可以使Python程序脱离解析器运行,能防止源代码泄漏(打包的时候已经把解析器给封装进去了)

使用方式:由于要将路径指引到Python文件所在的路径下,于是可以在要被转化为可执行文件的Python程序文件(扩展名为.py)的所在位置的空白区域,同时摁住鼠标右键和shift键,会弹出对话框,选择"在此处打开Powershell(cmd)窗口",就会弹出cmd命令窗口,这样就会自动锁定文件所在的路径,接下来就可以运行下面的代码,实现.exe可执行文件的转化

pyinstaller -F 要被转化为可执行文件的Python程序的文件名 	#比如文件为amazing.py,则填入amazing.py,注意扩展名也要写入

对应该Python程序生成的可执行文件就在dist(distribute)文件夹中

进行打包的同时可以指定生成的可执行文件的图标

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, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
-p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
–icon=file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标  pyinstaller -i  ico路径 xxxxx.py

–icon=file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)
-v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)
-n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字

常见问题以及解决方案

问题1:无法将“pyinstaller”项识别为…

有的时候可能在运行过程中会出现这种错误:
无法将“pyinstaller”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次
此时的解决方法:

1.查看是否下载了pyinstaller包

如果没有,请使用该命令进行pyinstaller第三方扩展库的下载:

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple 

2.查看已下载的第三方扩展库所在路径,找到一个名称为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:Shell窗口一闪而过而不是停留

可能有同学需要在运行可执行文件的过程中,Shell窗口停留一阵子,同时发现在运行我们Pyinstaller 模块生成的可执行文件的过程中,发现Shell窗口一闪而过了,这个时候可以在Python代码的最后添加上os.system(‘pause’)(需要先导入os标准库),再去生成可执行文件,即可实现Shell窗口停留的功能

问题3:打包出来的.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 等,其中比较推荐的是 pipenv,pipenv是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工具安装指定版本的第三方扩展库,并添加到 Pipfile
pipenv 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退出虚拟环境
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值