文章目录
前言
py2exe
py2exe是一个将python脚本转换为windows可以执行的第三方工具.它非常易于使用,只需要简单配置即可打包应用,与其他打包工具相比,py2exe支持多个python版本,并可生成独立运行的应用程序.
缺点:只能生成windows平台下面的可执行文件,并且会出现一些已知的bug
cx_Freeze
这是一个夸平台的python打包工具,可以将python打包为可执行文件或动态链接库,并支持多个操作系统,包括windows,linux,macos
优点是: 打包出来的可执行文件不需要python的安装环境,性能也不错,对各种python库的支持也比较好,可以正常打包大部分python应用
缺点是: 配置略显复杂,且打包的可执行文件可能比较大
pyinstaller
可以将python打包为可执行文件或动态链接库,并支持多个操作系统,包括windows,linux,macos,与其他打包相比,pyinstaller对第三方库的支持更加完善,并且支持多线程打包程序.
优点: 使用非常简单,只需要一条命令就可以打包python程序.此外,它的可执行文件大小相对较少,不需要安装python环境
缺点: 某些库需要进行额外的配置才能打包,比如numpy,在一些特殊情况下也会出现bug
Briefcase
使用pyinstaller打包,并提供了额外的工具来简化打包过程,支持夸平台,使用起来十分简单
优点: 易于使用,支持多平台,提供与打包相关的工具和文档
缺点: 功能简单,提供的模版也相对较少,需要开发者自己进行定制.只有部分三方库完美兼容Briefcase
工具对比总结
名称 | 是否跨平台 | 是否需要安装python环境 | 上手难易程度 | 优点 | 缺点 |
---|---|---|---|---|---|
py2exe | ❎ | ✅ | ✅ | 它非常易于使用,只需要简单配置即可打包应用 | 只能生成windows平台下面的可执行文件, |
cx_Freeze | ✅ | ❎ | ❎ | 不需要python的安装环境,性能也不错,对各种python库的支持也比较好 | 配置略显复杂,且打包的可执行文件可能比较大 |
pyinstaller | ✅ | ❎ | ✅ | 使用非常简单,只需要一条命令就可以打包python程序.此外,它的可执行文件大小相对较少,不需要安装python环境 | 某些库需要进行额外的配置才能打包,比如numpy |
Briefcase | ✅ | ❎ | ✅ | 易于使用,支持多平台,提供与打包相关的工具和文档 | 功能简单,提供的模版也相对较少,需要开发者自己进行定制.只有部分三方库完美兼容Briefcase |
使用pyinstaller
安装
pip install pyinstaller
命令选项
列出一些常用的选项,有些不常用得选项没有列出来
格式: pyinstaller [options] scriptname [scriptname ...]
scriptname:脚本名称,可以指定多次
options:
-h, --help 显示pyinstaller的帮助文档
-v, --version 显示pyinstaller的版本
--distpath DIR 输出的bundle文件的目录,默认是./dist
--clean 清楚构建的临时和缓存文件
--log-level LEVEL 构建时候的日志等级,日志等级有TRACE, DEBUG, INFO, WARN, DEPRECATION, ERROR, FATAL,默认是INFO
一些目录生成相关的选项:
-D, --onedir 创建一个bundle目录,包含可执行文件,默认是这个选项
-F, --onefile 只输出一个可执行文件,当执行这个可执行文件的时候,会将文件解压到临时目录中
--specpath DIR 指定一个文件存放spec文件,默认当前目录下
-n NAME, --name NAME 指定spec的名字,默认是第一个script的名字
哪些东西需要构建:
--add-data SOURCE:DEST
添加一些资源文件,DEST的相对于项目的根文件的路径,这个选项可以指定多次
--add-binary SOURCE:DEST
添加二进制文件,可以指定多次,主要是有些程序需要调用额外的可执行文件
-p DIR, --paths DIR 模块的搜索路径,可以指定多次,类似与spec中的pathex
--splash IMAGE_FILE 指定一个splash图片,再upacking时候显示,类似开机图片
如何生成选项:
--python-option PYTHON_OPTION 设置一些python解释器的参数,包括u,W,X选项
Windows and Mac OS X 特定选项:
-c, --console, --nowindowed 代开一个console界面,主要是为了使用I/O
-w, --windowed, --noconsole 不提供一个console,主要用于图形界面
-i <FILE.ico or FILE.exe,ID or FILE.icns or Image or "NONE">, --icon <FILE.ico or FILE.exe,ID or FILE.icns or Image or "NONE">
指定一个程序图标
Windows 特定:
--version-file FILE 从FILE添加version到exe中
-m <FILE or XML>, --manifest <FILE or XML>
Add manifest FILE or XML to the exe.
案例1: 使用命令打包一个PyQt5程序
项目功能:根据ip查询归属地
结构
main.py内容
import sys
from PyQt5.QtWidgets import QApplication, QWidget
import MyUI
if __name__ == "__main__":
app = QApplication(sys.argv)
window = QWidget()
ipSearchWindow = MyUI.MyUI()
ipSearchWindow.setupUi(window)
window.show()
sys.exit(app.exec_())
打包命令
pyinstaller.exe -w --add-data ip2region.xdb:./ main.py
会在当前目录下生成dist文件,打包好的文件放在这个目录中
如何访问打包的资源
基本原理:Pyinstaller 可以将资源文件一起bundle到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源
比如上面将ip2region.xdb:./放的打包后的根目录下,但是在执行的时候,是访问不到的,需要在在程序中拼接地址,转换为一个绝对地址
def resourePath(relative_path):
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
#dbPath是用到的ip数据库
dbPath = resourePath("ip2region.xdb")
案例2:在一个目录中打包多个可执行文件
假设有两个文件
#Hello1.py
print('hello 1')
#Hello2.py
print('hello 2')
为每个python脚本创建指定的spec文件,pyi-makespec是在安装pyinstaller一起安装的,执行这两条命令后会生成hello1.spec和hello2.spec,pyi-makespec使用的参数和pyinstaller是一样的,只是不进行打包操作.
pyi-makespec hello1.py
pyi-makespec hello2.py
生成得spec文件,使用hello1.spec举例
# hello1.spec
...
a = Analysis(['hello1.py'], ...)
pyz = PYZ(a.pure, a.zipped_data, ...)
exe = EXE(pyz,
a.scripts,
... )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
...)
组合两个spec文件,组成hello.spec
# hello.spec
...
hello1_a = Analysis(['hello1.py'], ...)
hello1_pyz = PYZ(hello1_a.pure, hello1_a.zipped_data, ...)
hello1_exe = EXE(hello1_pyz,
hello1_a.scripts,
...)
hello2_a = Analysis(['hello2.py'], ...)
hello2_pyz = PYZ(hello2_a.pure, hello2_a.zipped_data, ...)
hello2_exe = EXE(hello2_pyz,
hello2_a.scripts,
...)
coll = COLLECT(hello1_exe,
hello1_a.binaries,
hello1_a.zipfiles,
hello1_a.datas,
hello2_exe,
hello2_a.binaries,
hello2_a.zipfiles,
hello2_a.datas,
...
name='hello')
执行打包命令
pyinstaller hello.spec
案例3:给spec文件添加参数
有的时候,我们希望有不同的构建模式,比如debug,production构建,但是希望使用一个spec文件.把参数添加到pyinstaller 后面,使用"–"分隔,比如添加–debug参数,pyinstaller example.spec -- --debug
下面是这个example.spec内容
# example.spec
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--debug", action="store_true")
options = parser.parse_args()
a = Analysis(
['example.py'],
)
pyz = PYZ(a.pure)
if options.debug:
exe = EXE(
pyz,
a.scripts,
exclude_binaries=True,
name='example',
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
name='example_debug',
)
else:
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
name='example',
console=False,
)
工作原理
pyinstaller查找所有的import语句,并递归查找需要的包,也可以理解egg格式的包(添加它所依赖的包)。
pyinstaller也只一些大写的包,比如GUI包Qt,WxPython,TkInter,matplotlib等,完整列表
有些python脚本导入的包,pyinstaller是不能识别的,比如使用__import__()
函数,importlib.import_module() or,
sys.path`值,如果是这些情况,需要提供方法去让pyinstaller识别
- 在pyinstaller命令中,添加二外的文件
- 在pyinstaller命令中添加import路径
- 在spec文件中编辑,添加你需要额外添加的module
- 可以写一个hook文件,告知pyinstaller隐藏的imports
在使用打包成一个目录的情况:运行pyinstaller打包的程序时,使用pyinstaller bootloaders去实行我们的程序。这个bootloader会创建一个临时目录,这个目录放置脚本依赖的包和库,以便python解释器能够找到。bootloader在开始时候会复制一个python解释器去执行脚本。
在全部打包成一个文件的情况:pyinstaller将脚本和他的所有依赖都打包成一个可执行文件,优点时只需要一个文件就可发布,用户不用感知其他东西,缺点时你还需要单独发布README或其他相关文件,还有就是会是的启动时间加长。也是用bootloader去启动程序,开始的时候创建一个临时目录,这个目录名称是_MEI*xxxxxx*
,xxxxxx是随机数字,解压缩文件到这个临时目录中,所以会使得启动时间加长,程序结束后,会删除这个临时目录。这个临时目录可以使用--runtime-tempdir
指定。
-END-
Python入门教程
如果大家对python感兴趣,下面我会给大家免费分享一份Python全套学习资料, 包含视频、源码、课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,可以和我一起来学习交流。
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论
④ 20款主流手游迫解 爬虫手游逆行迫解教程包
⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解
⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解
⑦ 超300本Python电子好书,从入门到高阶应有尽有
⑧ 华为出品独家Python漫画教程,手机也能学习
⑨ 历年互联网企业Python面试真题,复习时非常方便
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉100道Python练习题👈
检查学习结果。
👉面试刷题👈
资料领取
这份完整版的Python全套学习资料已为大家备好,朋友们如果需要可以微信扫描下方二维码添加,输入"领取资料" 可免费领取全套资料【有什么需要协作的还可以随时联系我】朋友圈也会不定时的更新最前言python知识。↓↓↓
或者
【点此链接】领取