经过复杂的开发、调试之后,终于得到一个 Python 程序,这个程序或许精巧,或许有些古拙,但它是我们心血的结晶,我们当然希望将这个程序发布出来。
Python 提供了一个 zipapp 模块,通过该模块可以将一个 Python 模块(可能包含很多个源程序)打包成一个 Python 应用,甚至发布成一个 Windows 的可执行程序。
zipapp 是一个可以直接运行的模块,该模块用于将单个 Python 文件或整个目录下的所有文件打包成可执行的档案包。
zipapp 模块的命令行语法如下:
在上面命令中,source 参数代表要打包的 Python 源程序或目录,该参数既可以是单个的 Python 文件,也可以是文件夹。如果 source 参数是文件夹,那么 zipapp 模块会打包该文件夹中的所有 Python 文件。
该命令的 options 支持如下选项:
下面在某目录下建立一个 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 目录的父目录),然后执行如下命令:
上面命令指定将当前目录下的 app 子目录下的所有 Python 源文件打包成一个档案包,并通过 -o 选项指定所生成的档案包的文件名为 first.pyz;-m 选项指定使用 app.py 模块中的 main 函数作为程序入口。
运行上面命令,将会生成一个 first.pyz 文件。接下来可以使用 python 命令来运行 first.pyz 文件:
通过命令行工具在 app 目录的父目录下执行如下命令:
上面命令没有指定 -o 选项,这意味着该命令将会使用默认的输出文件名:source 参数值加 .pyz 后缀。运行上面命令,将会在当前目录下生成一个 app.pyz 文件。
通过上面介绍的方式打包得到的档案包中只有当前项目的 Python 文件,如果 Python 应用还需要使用第三方模块和包(比如前面介绍的需要连接 MySQL 的应用),那么仅打包该应用的 Python 程序是不够的。
为了创建能独立启动的应用(自带依赖模块和包),需要执行两步操作:
下面在 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='\t')
print('\n--------------------------------')
# 直接使用for循环来遍历游标中的结果集
for row in c:
print(row)
print(row[1] + '-->' + row[2])
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()
最后按照如下步骤将 dbapp 子目录下的应用打包成独立应用:
在创建了独立应用之后,只要目标机器上安装了合适版本的 Python 解释器,即可运行该独立应用。我们可以先使用如下命令卸载在 Python 目录下安装的 mysql-connector-python 模块:
此时在本机的 Python 目录下不再包含 mysql-connector-python 模块,但 dbapp.pyz 程序依然可以正常运行,因为它自包含了 mysql-connector-python 模块。