经过复杂的开发、调试之后,终于得到一个 Python 程序,这个程序或许精巧,或许有些古拙,但它是我们心血的结晶,我们当然希望将这个程序发布出来。

Python 提供了一个 zipapp 模块,通过该模块可以将一个 Python 模块(可能包含很多个源程序)打包成一个 Python 应用,甚至发布成一个 Windows 的可执行程序。

生成可执行的Python档案包

zipapp 是一个可以直接运行的模块,该模块用于将单个 Python 文件或整个目录下的所有文件打包成可执行的档案包。

zipapp 模块的命令行语法如下:

python -m zipapp source [options]

在上面命令中,source 参数代表要打包的 Python 源程序或目录,该参数既可以是单个的 Python 文件,也可以是文件夹。如果 source 参数是文件夹,那么 zipapp 模块会打包该文件夹中的所有 Python 文件。

该命令的 options 支持如下选项:

-o ,--output=:应选项指定输出档案包的文件名。如果不指定该选项,所生成的档案包的文件名默认为 source 参数值,并加上 .pyz 后缀。

-p ,--python=:改选项用于指定 Python 解释器。

-m ,--main=:该选项用于指定 Python 程序的入口函数。该选项应该为 pkg.mod:fn 形式,其中 pkg.mod 是一个档案包中的包或模块,fn 是指定模块中的函数。如果不指定该选项,则默认从模块中的 __main__.py 文件开始执行。

-c,--compress:从 Python 3.7 开始支持该选项。该选项用于指定是否对档案包进行压缩来减小文件的大小,默认是不压缩。

--info:该选项用于在诊断时显示档案包中的解释器。

-h,--help:该选项用于显示 zipapp 模块的帮助信息。

下面在某目录下建立一个 app 子目录,该子目录用于包含多个 Python 程序。首先在该目录下开发一个 say_hello.py 程序:

def say_hello(name):

return name + ",您好!"

然后在该目录下开发一个 app.py 程序来使用 say_hello 模块:

from say_hello import *

def main():

print('程序开始执行')

print(say_hello('孙悟空'))

在命令行工具中进入该目录(app 目录的父目录),然后执行如下命令:

python -m zipapp app -o first.pyz -m "app:main"

上面命令指定将当前目录下的 app 子目录下的所有 Python 源文件打包成一个档案包,并通过 -o 选项指定所生成的档案包的文件名为 first.pyz;-m 选项指定使用 app.py 模块中的 main 函数作为程序入口。

运行上面命令,将会生成一个 first.pyz 文件。接下来可以使用 python 命令来运行 first.pyz 文件:

python first.pyz

程序开始执行

孙悟空,您好!

通过命令行工具在 app 目录的父目录下执行如下命令:

python -m zipapp app -m "app:main"

上面命令没有指定 -o 选项,这意味着该命令将会使用默认的输出文件名:source 参数值加 .pyz 后缀。运行上面命令,将会在当前目录下生成一个 app.pyz 文件。

zipapp创建独立应用

通过上面介绍的方式打包得到的档案包中只有当前项目的 Python 文件,如果 Python 应用还需要使用第三方模块和包(比如前面介绍的需要连接 MySQL 的应用),那么仅打包该应用的 Python 程序是不够的。

为了创建能独立启动的应用(自带依赖模块和包),需要执行两步操作:

将应用依赖的模块和包下载到应用目录中。

使用 zipapp 将应用和依赖模块一起打包成档案包。

下面在 app 所在目录下再创建一个 dbapp 子目录,该子目录将会作为本应用的目录。接下来在 dbapp 目录下新建一个 __main__.py 文件作为程序入口,这样程序在打包档案包时就不需要指定程序入口了。

下面是 __main__.py 文件的代码:

from exec_select import *

# 执行query_db()函数

query_db()

其中,exec_select.py 文件需要自己添加,包含代码如下:

# 导入访问MySQL的模块

import mysql.connector

def query_db():

# ①、连接数据库

conn = conn = mysql.connector.connect(user='root', password='32147',

host='localhost', port='3306',

database='python', use_unicode=True)

# ②、获取游标

c = conn.cursor()

# ③、调用执行select语句查询数据

c.execute('select * from user_tb where user_id > %s', (2,))

# 通过游标的description属性获取列信息

for col in (c.description):

print(col[0], end=' ')

print(' --------------------------------')

# 直接使用for循环来遍历游标中的结果集

for row in c:

print(row)

print(row[1] + '-->' + row[2])

# ④、关闭游标

c.close()

# ⑤、关闭连接

conn.close()

最后按照如下步骤将 dbapp 子目录下的应用打包成独立应用:

通过命令行工具在dbapp当前所在目录执行如下命令:

python -m pip install -r requirements.txt --target dbapp

上面命令实际上就是使用 pip 模块来安装模块,其中 python -m pip install 表示要安装模块。--target 选项指定将模块安装到指定目录下,此处指定将依赖模块安装到 dbapp 子目录下。-r 选项指定要安装哪些模块,此处使用 requirements.txt 文件列出要安装的模块和包。-r 选项支持两个值:

直接指定要安装的模块或包。

使用清单文件指定要安装的模块和包。

当应用依赖的模块较多时,建议使用清单文件来列出所依赖的模块。

如果直接运行上面命令,pip 模块会提示找不到 requirements.txt 文件,因此需要在当前目录下添加一个 requirements.txt 文件,并在该文件中增加如下一行。

mysql-connector-python

如果项目需要依赖多个模块,则可以在 requirements.txt 文件中定义多行,每行定义一个模块。

重新运行上面命令,将可以看到 pip 开始下载 mysql-connector-python 模块,下载完成后将可以在 dbapp 子目录下看到大量有关 mysql-connector-python 模块的文件。

如果 pip 在 dbapp 子目录下生成了 .dist-info 目录,则建议删除该目录。

使用 zipapp 模块执行打包操作。由于本例的 dbapp 子目录下包含了 __main__.py 文件,该文件将会作为程序入口,因此打包时不需要指定 -m 选项。使用如下命令来打包:

python -m zipapp dbapp

与上一节所使用的命令相比,该命令没有使用 -m 边项来指定程序入口,该程序将会使用档案包中的 __main__.py 文件作为程序入口。运行上面命令,将会得到一个大约为 18MB 的档案包。因为该档案包自包含了 mysql-connector-python 模块,所以比较大。

在创建了独立应用之后,只要目标机器上安装了合适版本的 Python 解释器,即可运行该独立应用。我们可以先使用如下命令卸载在 Python 目录下安装的 mysql-connector-python 模块:

pip uninstall mysql-connector-python

此时在本机的 Python 目录下不再包含 mysql-connector-python 模块,但 dbapp.pyz 程序依然可以正常运行,因为它自包含了 mysql-connector-python 模块。

python app教程-Python zipapp打包教程(超级详细)相关推荐

  1. python程序打包成安卓app教程_Python zipapp打包教程(超级详细)

    经过复杂的开发.调试之后,终于得到一个 Python 程序,这个程序或许精巧,或许有些古拙,但它是我们心血的结晶,我们当然希望将这个程序发布出来. Python 提供了一个 zipapp 模块,通过该 ...

  2. python zipapp_Python zipapp打包教程(超级详细)

    经过复杂的开发.调试之后,终于得到一个 Python 程序,这个程序或许精巧,或许有些古拙,但它是我们心血的结晶,我们当然希望将这个程序发布出来. Python 提供了一个 zipapp 模块,通过该 ...

  3. python app-Python zipapp打包教程(超级详细)

    经过复杂的开发.调试之后,终于得到一个 Python 程序,这个程序或许精巧,或许有些古拙,但它是我们心血的结晶,我们当然希望将这个程序发布出来. Python 提供了一个 zipapp 模块,通过该 ...

  4. python爬虫之获取QQ关系网(超级详细)

    一.背景: 继上次QQ空间登陆后获取QQ好友.群友.群信息之后,需求又扩大了,变成了获取QQ关系网,什么意思呢:就是给你一个QQ,然后从这个QQ出发,通过该QQ的说说.点赞.评论获取该QQ有过交集的人 ...

  5. Python很难学?大佬推荐超级详细的Python爬虫学习清单,免费教程

    0. Python 基础 先放上Python 3 的官方文档:https://docs.python.org/3/ (看文档是个好习惯) 关于Python 3 基础语法方面的东西,网上有很多,大家可以 ...

  6. python装饰器-Python @函数装饰器及用法(超级详细)

    前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod.@classmethod 和 @property,其中 staticmethod().class ...

  7. 【Python】Python中pip命令的使用(超级详细,命令大全)

    系列文章目录 Python 中 pip 常见命令 文章目录 系列文章目录 前言 一.python pip 命令 二.命令总结 1.显示列表pip list 2.安装命令pip install 3.安装 ...

  8. 红帽linux7.2安装教程,RHEL 6.2安装(超级详细图解教程) | 系统运维

    附:RHEL6.2下载地址 用光盘或者U盘成功引导后,出现如下界面: 界面说明: Install or upgrade an existing system安装或升级现有的系统 install sys ...

  9. python 分类变量转为哑变量_超级详细的特征哑变量处理

    这里全程以df这个为例来讲解 import pandas as pd df=pd.DataFrame({'性别':['男','女','男','女'],'age':[2,3,4,3]}) df get_ ...

最新文章

  1. 203. 移除链表元素(C语言)
  2. 用图讲解狄克斯特拉(DiskStra)算法,python实现 。
  3. wx.createInnerAudioContext seek方法执行后,监听事件onTimeUpdate无效?
  4. SAP新一代全栈开发工具:SAP Business Application Studio
  5. 坦克大战系列6-API常用函数说明2
  6. Prototype模式
  7. 关于类和接口的一些小笔记
  8. KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结
  9. 女生适合当程序员吗?
  10. viso 画背景框_手工界新宠:美绝了的浮雕画,揉揉捏捏一幅画
  11. 尼康数码相机照片数据恢复怎么办
  12. 差分管电路图_差分放大器的非线性应用
  13. 黑盒测试用例编写八大方法
  14. 应用StarRocks实现存储引擎的收敛,保障高查询并发及低延迟要求
  15. TM1650芯片驱动四位数码管
  16. Ubuntu的一些实用软件
  17. 微信小程序相关一、模仿京东静态登录页面
  18. 【转帖】姑娘不是你想追,想追就能追。
  19. Reinforced History Backtracking for Conversational Question Answering论文翻译
  20. iOS 更新自动布局,获取子视图frame

热门文章

  1. C++知识点记录(C++ primer)
  2. cpio用法详细说明
  3. Maven的配置文件pom.xml
  4. linux下如何修改根口令
  5. python自动化测试看什么书-《自动化平台测试开发-Python测试开发实战》新书出版了...
  6. 自学python可以做什么兼职-一行生财:毕业100天,通过副业赚(挣)到我的第一个10w...
  7. python绘制灰度图片直方图-python数字图像处理(9):直方图与均衡化
  8. python第三方库有哪些常用的、请列举15个-python基础面试常见题
  9. python有道翻译-Python调用有道词典翻译
  10. 哪里可以接到python的活干-学了Python以后,我干了很多不是人干的活