疯狂Python讲义学习笔记(含习题)之打包和发布

一、使用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的名字
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值