一、使用zipapp模块
该模块可以将一个Python模块(可能包含很多个源程序)打包成一个Python应用,也可以发布成一个Windows的可执行程序。
(一)生成可执行的Python档案包
zipapp是一个可以直接运行的模块,用于将单个Python文件或整个目录下的所有文件打包成可执行的档案包。
语法:
python -m zipapp source [options]
source参数代表要打包的Python源程序或目录,即可以是单个的Python文件,也可以是文件夹。
** options选项 **
选项 | 描述 |
---|---|
-o , --output= | 指定输出档案包的文件名。如果不指定该选项,所生成的档案包的文件名默认为source参数值,并加上.pyz后缀。 |
-p ,–python= | 指定Python解释器 |
-m , --main= | 指定Python程序的入口函数。该选项应该为pkg.mod:fn形式,其中pkg.mod是一个档案包中的包或模块,fn是指定模块中的函数。如果不指定该选项,默认从模块中的__main__.py文件开始执行。 |
-c, --compress: | 从Python3.7开始支持该选项。该选项用于指定是否对档案包进行压缩来减小文件的大小,默认不压缩。 |
–info | 用于在诊断时显示档案包中的解释器。 |
-h, --help | 用于显示zipapp模块的帮助信息。 |
演示
建立app文件夹,在文件夹中,建立say_hello.py和app.py源文件,代码如下:
say_hello.py
def say_hello(name):
return name + ", 您好!"
app.py
from say_hello import say_hello
def main():
print('程序开始执行')
print(say_hello('ib-top'))
从命令行进入app目录的上级目录,然后执行如下命令:
python -m zipapp app -o first.pyz -m "app:main"
以上命令将app子目录下的所有Python源文件打包成一个档案包,并通过-o 选项指定所生成的档案包名为first.pyz,-m选项指定使用app.py模块中的main函数作为程序入口。
生成的.pyz文件,可以通过命令行工具直接执行:
如果在命令中没有指定-o选项,则会生成一个与source参数同名的.pyz文件,即app.pyz。
(二)创建独立应用
如果Python应用还需要使用第三方模块和包(如MySQL模块),那么仅仅打包该应用的Python源文件是不够的。
创建独立启动的应用(自带依赖模块和包),需要执行两步操作:
① 将应用依赖的模块和包下载到应用目录中
② 使用zipapp将应用和依赖模块一起打包成档案包
演示
创建dbapp目录,在该目录下创建exec_select.py和__main__.py源文件,并在dbapp上级目录中创建依赖包文件requirements.txt:
exec_select.py
# 导入访问SQLite的模块
import sqlite3
def query_db():
# ①、打开或创建数据库
# 也可以使用特殊名::memory:代表创建内存中的数据库
conn = sqlite3.connect('first.db')
# ②、获取游标
c = conn.cursor()
# ③、调用执行select语句查询数据
c.execute('select * from user_tb where _id > ?', (2,))
print('查询返回的记录数:', c.rowcount)
# 通过游标的description属性获取列信息
for col in (c.description):
print(col[0], end='\t')
print('\n--------------------------------')
while True:
# 获取一行记录,每行数据都是一个元组
row = c.fetchone()
# 如果抓取的row为None,退出循环
if not row :
break
print(row)
print(row[1] + '-->' + row[2])
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()
main.py
from exec_select import *
# 执行query_db()函数
query_db()
requirements.txt内容
mysql-connector-python
① 通过命令行工具在dbapp目录的上级目录中执行命令:
python -m pip install -r requlrements.txt --target dbapp
此命令实际上是通过pip将requirements.txt中指定的模块安装到dbapp目录下。-r选项指定要安装哪些模块,此处使用requirements.txt文件列出要安装的模块和包。–target指定将模块安装到指定目录下,此处指定的是dbapp。
如果项目需要依赖多个模块,则可以在requirements.txt文件中定义多行,每行定义一个模块。
② 如果pip在dbapp子目录中生成了.dist-info目录,则建议删除该目录
③ 使用zipapp模块执行打包操作。
python -m zipapp dbapp
由于dbapp下包含了__main__.py文件,因此可以不指定程序入口
运行命令后会在dbapp的上级目录中生成dbapp.pyz文件。
④ 创建了独立应用之后,只要目标机器上安装了合适版本的Python解释器,就可以运行该独立应用。
二、使用PyInstaller生成可执行程序
创建了独立应用(自包含该应用的依赖包)之后,还可以使用PyInstallers将Python程序生成可直接运行的程序,这程序可以被分发到对应的Windows或Mac OS X平台上运行。
(一)安装PyInstaller
Python默认不包含PyInstaller模块,需要自行安装。
可以直接使用pip命令安装:
pip install pyinstaller
(二)生成可执行程序
语法:
pyinstaller 选项 python源文件
不管这个Python应用是单文件应用,还是多文件应用,只要在使用pyinstaller命令时编译作为程序入口的Python程序即可。
修改app.py文件,添加调用mian()函数代码:
from say_hello import say_hello
def main():
print('程序开始执行')
print(say_hello('ib-top'))
if __name__ == '__main__':
main()
使用命令行工具进入到app目录下,执行如下命令:
pyinstaller -F app.py
命令执行完成后,会在app目录下生成一个dist目录,该目录下执行app.exe将会看到程序的输出结果。
** PyInstaller支持的常用选项 **
选项 | 作用 |
---|---|
-h, --help | 查看该模块的帮助信息 |
-F, --onefile | 产生单个的可执行文件 |
-D, --onedir | 产生一个目录(包含多个文件)作为可执行程序 |
-a, --ascii | 不包含Unicode字符集支持 |
-d, --debug | 产生debug版本的可执行文件 |
-w, --windowed, --noconsole | 指定程序运行时不显示命令行窗口(仅对Windows有效) |
-c, --nowindowed, --console | 指定使用命令行窗口运行程序(仅对Windows有效) |
-o DIR, --out=DIR | 指定spec文件的生成目录,如果没有指定,则默认使用当前目录来生成spec文件 |
-p DIR, --path=DIR | 设置Python导入模块的路径(和设置PYTHONPATH环境变量的作用相似),也可以使用路径分隔符(Windows使用分号,Linux使用冒号)来分隔多个路径 |
-n NAME, --name=NAME | 指定项目(产生的spec)名字。如果省略,则用第一个脚本的主文件名作为spec的名字 |