python打包工具

159 篇文章 0 订阅
23 篇文章 1 订阅

前言

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查询归属地

结构

img

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文件,打包好的文件放在这个目录中

img

如何访问打包的资源

基本原理: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知识。↓↓↓
或者

点此链接】领取

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值