Python 运维(三):使用 zipapp 将 Python 程序打包成单个可执行文件

在这里插入图片描述

大家好,我是水滴~~

在 Python 开发中,我们经常需要将应用程序打包成可执行文件,以便在不具备 Python 环境的计算机上运行。Python 提供了多种打包工具,其中之一就是 zipappzipapp 可以将 Python 应用程序及其依赖打包成一个单独的 ZIP 文件,使其能够在没有 Python 解释器的环境中执行。

本文将详细介绍 zipapp 的使用方法,并提供代码示例,希望能够帮助新手同学快速入门。

《Python入门核心技术》专栏总目录・点这里

文章目录

  • 前言
  • 一、两种打包方式
  • 二、通过【命令行接口】打包
    • 2.1 语法结构
    • 2.2 代码示例一
    • 2.3 代码示例二
  • 三、通过【Python API】打包
    • 3.1 zipapp 模块
    • 3.2 代码示例
  • 总结


前言

zipapp 模块是一个 Python 标准库模块,它提供了一套管理工具,用于创建包含 Python 代码的压缩文件。这些压缩文件可以直接由 Python 解释器执行,就像运行普通的 Python 脚本一样。

使用 zipapp 模块,你可以将 Python 代码和相关依赖项打包成一个自包含的压缩文件,其中包含了应用程序的所有必要组件。这样,你可以将整个应用程序作为一个单一的文件进行分发和共享,而无需用户单独安装依赖项或设置环境。

一、两种打包方式

zipapp 模块提供了两种使用方式:

  • 命令行接口:你可以在命令行中直接使用 zipapp 命令来创建压缩文件。通过命令行接口,你可以指定要打包的源代码目录、输出文件的名称以及其他选项,例如入口点和依赖项等。

  • Python APIzipapp 模块还提供了 Python API,可以在 Python 代码中直接使用相关函数来创建压缩文件。通过 Python API,你可以以编程方式控制压缩文件的创建过程,并根据需要自定义各种选项,例如入口点、依赖项、压缩级别等。

下面将详细介绍这两种打包方式。

二、通过【命令行接口】打包

2.1 语法结构

当使用 zipapp 模块的命令行接口来创建压缩文件时,你可以使用以下语法:

python -m zipapp <source> [-h, --help] [-o <output>, --output <output>] [-p <python>, --python <python>] [-m <main>, --main <main>] [-c, --compress] [--info]

让我们来逐个介绍这些参数的含义:

参数含义
<source>必需参数,指定要打包成压缩文件的源代码目录。这个目录应该包含你的Python脚本以及其他相关文件。
-h, --help显示帮助信息并退出
-o <output>, --output <output>指定输出压缩文件的名称。默认情况下,使用源代码目录的名称,并添加 .pyz 扩展名。
-p <interpreter>, --python <interpreter>指定要使用的Python解释器。可以是解释器的路径或可执行命令。例如,-p D:\Python\Python311-p python。默认情况下,使用当前正在运行的Python解释器。
-m <mainfn>, -main <mainfn>指定应用程序的主函数,默认使用 __main__.py。mainfn 参数的形式应为 “pkg.mod:fn”,其中 “pkg.mod”是打包文件中的某个包/模块,“fn”是该模块中的一个可调用函数。
-c, --compress指定是否使用默认的压缩方法对文件进行压缩。默认情况下,文件是未经压缩的存储的。
--info显示压缩文件中的解释器信息。当你指定 --info 参数时,zipapp 将提取压缩文件中的解释器信息,并将其显示在命令行中。这对于查看压缩文件中使用的Python解释器的路径和版本非常有用。

2.2 代码示例一

现在,让我们看一个示例,演示如何使用命令行接口来创建压缩文件。

假设我们有以下目录结构:

myapp1
|-- myscript.py
|-- mymodule.py

mymodel.py代码内容:

# utils.py
import timedef greet(name):print(f"Hello, {name}!")time.sleep(2)print("再见~")time.sleep(1)

myscript.py代码内容:

from mymodule import greetdef hello():name = input("请输入你的名字: ")greet(name)if __name__ == "__main__":hello()

我们想要将 myapp1 目录打包成一个可执行的压缩文件。

使用以下命令:

python -m zipapp myapp1 -m myscript:hello -o myapp1.pyz

这将创建一个名为 myapp1.pyz 的压缩文件,其中 myscript:hello 将作为入口点(即:使用 myscript.py 模块下的 hello 函数作为入口点)。你可以直接运行该文件来执行你的Python应用程序。

2.3 代码示例二

如果模块中没有 __main__.py 文件,则 -m 参数是必须;如果有该入口文件,则无需指定了。下面将演示使用默认的__main__.py 文件表示主函数的方式。

创建一个myapp2目录,并将myapp1中的两个 Python 文件拷贝到 myapp2中,最后将 myapp2 中的myscript.py重命名为 __main__.py

myapp2
|-- __main__.py
|-- mymodule.py

下面将 myapp2 目录打包成一个可执行的压缩文件,命令如下:

python -m zipapp myapp2 -o myapp2.pyz

这将创建一个名为 myapp2.pyz 的压缩文件,并默认使用 __main__.py 文件作为入口函数(要求该文件下必须有main 函数)。你可以直接运行该文件来执行你的Python应用程序。

三、通过【Python API】打包

3.1 zipapp 模块

zipapp 模块是 Python 3.5 引入的标准库,可以通过以下方式导入:

import zipapp

zipapp 模块提供了一个函数 create_archive(),用于创建 zipapp 文件。该函数的基本语法如下:

zipapp.create_archive(source, target, interpreter=None, main=None, compressed=False)
  • source:要打包的源目录或源文件的路径。

  • target:生成的 zipapp 文件的路径。

  • interpreter:可选参数,指定要用于执行 zipapp 的 Python 解释器路径。

  • main:可选参数,指定 zipapp 的入口点(main 函数)路径。

  • compressed:可选参数,指定是否压缩生成的 zipapp 文件。

3.2 代码示例

我们还是使用上一节中的目录结构:

myapp1
|-- myscript.py
|-- mymodule.py
myapp2
|-- __main__.py
|-- mymodule.py

创建一个zipapp打包.py的 Python 文件,内容如下:

import zipapp# 打包 myapp1 目录,并指定 myscript:hello 为入口函数
zipapp.create_archive("myapp1", "myapp1.pyz", main='myscript:hello')# 打包 myapp2 目录,默认使用 __main__.py 为入口文件
zipapp.create_archive("myapp2", "myapp2.pyz")

以上代码使用了 zipapp 模块来创建压缩文件。

  • 首先,通过 import zipapp 导入了 zipapp 模块。

  • 第一个 zipapp.create_archive() 函数调用用于打包名为 “myapp1” 的目录,并将其保存为 “myapp1.pyz” 压缩文件。同时,使用 main='myscript:hello' 参数指定了入口函数为 “myscript:hello”。这意味着在执行压缩文件时,将会调用 “myscript” 模块中的 “hello” 函数作为应用程序的入口点。

  • 第二个 zipapp.create_archive() 函数调用用于打包名为 “myapp2” 的目录,并将其保存为 “myapp2.pyz” 压缩文件。这里没有指定 main 参数,因此默认使用目录中的 __main__.py 文件作为入口文件,执行时会调用该文件件中的主函数。

通过以上代码,你可以创建两个压缩文件 “myapp1.pyz” 和 “myapp2.pyz”。其中 “myapp1.pyz” 使用 “myscript:hello” 函数作为入口点,而 “myapp2.pyz” 使用目录中的__main__.py 文件作为入口点。

总结

使用zipapp模块,你可以轻松地将 Python 应用程序打包成一个独立的可执行文件,方便地在不同的环境中部署和分享。无论是通过命令行接口还是 Python API,zipapp模块都提供了灵活的工具,使你能够创建自包含的Python应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/297466.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring5底层原理之BeanFactory与ApplicationContext

目录 BeanFactory与ApplicationContext BeanFactory ApplicationContext 容器实现 BeanFactory实现 ApplicationContext实现 ClassPathXmlApplicationContext的实现 AnnotationConfigApplicationContext的实现 AnnotationConfigServletWebServerApplicationContext的实…

【项目管理】CMMI-需求跟踪矩阵模版

需求菜单/功能模块需求名称需求变更类型&#xff08;新增、修改&#xff09;需求状态&#xff08;已建议、已批准、已设计、已实现、已验证、已删除&#xff09;优先级&#xff08;高、中、低&#xff09;软件需求&#xff08;工作产品、章节号&#xff09;概要设计&#xff08…

听GPT 讲Rust源代码--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代码中&#xff0c;suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目录下&#xff0c;用于实现Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

【计算机网络】网络层——IP协议

目录 一. 基本概念 二. 协议报文格式 三. 网段划分 1. 第一次划分 2. CIDR方案 3. 特殊的IP地址 四. IP地址不足 1. 私有IP和公网IP 2. DHCP协议 3. 路由器 4. NAT技术 内网穿透(NAT穿透) 五. 路由转发 路由表生成算法 结束语 一. 基本概念 IP指网络互连协议…

【C++】开源:FLTK图形界面库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍FLTK图形界面库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0…

[c]扫雷

题目描述 扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。 玩家翻开一个非地雷格时&#xff0c;该格将会出现一个数字——提示周围格子中…

vmware安装中标麒麟高级服务器操作系统 V7.0

vmware安装中标麒麟高级服务器操作系统 V7.0 1、下载中标麒麟高级服务器操作系统 V7.0镜像2、安装中标麒麟高级服务器操作系统 V7.02.2、安装虚拟机 1、下载中标麒麟高级服务器操作系统 V7.0镜像 官方提供使用通道 访问官网 链接: https://www.kylinos.cn/ 下拉到页面最底部 点…

计算机视觉基础(11)——语义分割和实例分割

前言 在这节课&#xff0c;我们将学习语义分割和实例分割。在语义分割中&#xff0c;我们需要重点掌握语义分割的概念、常用数据集、评价指标&#xff08;IoU&#xff09;以及经典的语义分割方法&#xff08;Deeplab系列&#xff09;&#xff1b;在实例分割中&#xff0c;需要知…

工资发放 C语言xdoj92

题目描述&#xff1a; 公司财务要发工资现金&#xff0c;需要提前换取100元、50元、20元、10元、5元和1元的人民币&#xff0c; 请输入工资数&#xff0c;计算张数最少情况下&#xff0c;各自需要多少张。 输入格式&#xff1a;共一行&#xff0c;输入一个正整数。 输出格式&am…

Linux:jumpserver介绍(1)

官方网站 JumpServer - 开源堡垒机 - 官网https://www.jumpserver.org/ JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpServer 帮助企业以更安全的方式管控和登录所有类型的资产&#xff0c;实现事前授权、事中监察、事后审计&…

百分百能遇到的接口自动化测试面试题,看完的现在已经在办理入职了...

1. 什么是接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试是指使用自动化工具对接口进行测试&#xff0c;验证接口的正确性、稳定性和性能等方面的指标。 2. 为什么要进行接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试可以提高测试效率&#xff0c;减…