Py打包应用程序(zipapp打包.pyz文件、pyinstaller打包exe文件)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44015805/article/details/101103620
'''
Py打包应用程序.py
(zipapp打包.pyz文件、pyinstaller打包exe文件)


注意:
一、zipapp模块 打包档案包 的 命令行语法: python -m zipapp source [options]
1、source参数 代表要打包的 Python 源程序或目录,该参数既可以是单个的 Python 文件,也可以是文件夹。
source参数 如果是文件夹,那么 zipapp 模块会打包该文件夹中的所有 Python 文件。
2、options的选项-m后面指定的程序入口 "模块名:函数名" 需要用 双引号 括起来,单引号则报错。
如果不指定该-m选项,则默认从模块中的 __main__.py 文件开始执行。



使用:
一、zipapp模块 打包档案包  (.pyz文件 支持在python环境下运行)
zipapp模块 是一个可以直接运行的模块,该模块用于将单个 Python 文件或整个目录下的所有文件打包成可执行的档案包。
zipapp模块 通过该模块可以将一个 Python 模块(可能包含很多个源程序)打包成一个 Python 应用,甚至发布成一个 Windows 的可执行程序。

#1、zipapp命令行指令打包档案包目录
zipapp模块 打包档案包 的 命令行语法 如下:
#python -m zipapp source [options]
#如:python -m zipapp app -m "app模块名:main函数名"
#即:指定将当前目录下的 app 子目录下的所有 Python 源文件打包成一个档案包,
#并通过-m 选项指定使用 app.py 模块中的 main 函数作为程序入口。
#如果不指定该-m选项,则默认从模块中的 __main__.py 文件开始执行。

2、zipapp创建独立应用,即 使用zipapp命令行指令将 包目录和依赖模块 一同打包成档案包
pip模块 下载包 的命令行语法 如下:
python -m pip install -r requirements.txt --target dbapp
2.1、-r选项支持两个选项:
一个是直接指定要安装的模块或包。另一个使用清单文件指定要安装的模块和包。  
当应用依赖的模块较多时,建议使用清单文件来列出所依赖的模块。
依赖包txt文件需要 在包目录的同级目录创建 并 添加文件内容,每一行为一个依赖包名称 如:mysql-connector-python
2.2、--target 选项指定将模块安装到指定目录下,此处指定将依赖模块安装到 包目录 即 dbapp子目录下。


二、pyinstaller模块 打包exe应用程序  (.exe 支持在电脑终端运行)
PyInstaller模块 将 Python 程序生成可直接运行的程序,这个程序就可以被分发到对应的 Windows 或 Mac OS X 平台上运行

1、pyinstaller模块 打包exe程序 的命令行语法如下:
pyinstaller 选项 python源文件
1.1、pyinstaller打包exe文件 -F选项 指定打包成单个可执行的exe文件  
1.2、pyinstaller打包exe文件 -D选项 指定打包生成一个目录(包含多个文件)来作为程序  
通过结合-w选项不生成命令行界面 及 在代码中结合 tkiner模块构建 来实现图形用户界面程序。
'''


# =============================================================================
# #zipapp模块 打包档案包  .pyz文件 支持在python环境下运行
# #zipapp模块 是一个可以直接运行的模块,该模块用于将单个 Python 文件或整个目录下的所有文件打包成可执行的档案包。
# #zipapp模块 通过该模块可以将一个 Python 模块(可能包含很多个源程序)打包成一个 Python 应用,甚至发布成一个 Windows 的可执行程序。
# =============================================================================

#使用:
#1、zipapp模块 打包档案包 的 命令行语法 如下:
#python -m zipapp source [options]
#如:python -m zipapp app -m "app模块名:main函数名"
#即:指定将当前目录下的 app 子目录下的所有 Python 源文件打包成一个档案包,并通过-m 选项指定使用 app.py 模块中的 main 函数作为程序入口。
#如果不指定该-m选项,则默认从模块中的 __main__.py 文件开始执行。



#注意:
#zipapp模块 打包档案包 的 命令行语法: python -m zipapp source [options]
#1、source参数 代表要打包的 Python 源程序或目录,该参数既可以是单个的 Python 文件,也可以是文件夹。
#source参数 如果是文件夹,那么 zipapp 模块会打包该文件夹中的所有 Python 文件。
#2、options的选项-m后面指定的程序入口 "模块名:函数名" 需要用 双引号 括起来,单引号则报错。
#如果不指定该-m选项,则默认从模块中的 __main__.py 文件开始执行。


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

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

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

#-p <interpreter>,--python=<interpreter>:    #改选项用于指定 Python 解释器。
#-c,--compress: 从 Python 3.7 开始支持该选项。该选项用于指定是否对档案包进行压缩来减小文件的大小,默认是不压缩。
#--info:        该选项用于在诊断时显示档案包中的解释器。
#-h,--help:    该选项用于显示 zipapp 模块的帮助信息。



##########
#示例    zipapp命令行指令打包档案包目录

#首先,新建 zipapp打包档案包目录 ,该目录下建立一个 app子目录,该 app子目录 用于包含多个 Python 程序。
#app子目录下新建 zipapp_say_hello.py 和 app.py

#zipapp_say_hello.py
def say_hello(name):
    return str(name) + '你好'

#app.py
from zipapp_say_hello import *

def main():
    print('程序开始执行')
    print(say_hello('血皇敖天'))
    
    
#然后,在新建的 zipapp打包档案包目录 下运行CMD命令如下:
#python -m zipapp app -o first.pyz -m "app:main"

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


#最后,打包档案包指令完成后,会在当前目录生成 first.pyz 文件
#通过CDM命令 python first.pyz 运行该文件。 



##########
#示例    zipapp创建独立应用,即 使用zipapp命令行指令将 包目录和依赖模块 一同打包成档案包

#首先,新建 zipapp打包档案包目录 ,该目录下建立一个 dbapp子目录,该 dbapp子目录 用于包含多个 Python 程序。
#dbapp子目录下新建 zipapp_exec_select.py 和 __main__.py

#zipapp_exec_select.py
import mysql.connector

def query_db():
    #链接数据库
    conn=mysql.connector.connect(user='root',password='yangshujke5',
                                 host='localhost',port='3306',
                                 databass='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()


#__main__.py
from zipapp_exec_select import *
query_db()  #执行query_db()函数


#然后,下载所需的依赖包到指定当前目录下,

#使用:
#pip模块 下载包 的命令行语法 如下:
#python -m pip install -r requirements.txt --target dbapp
#1、-r选项支持两个选项:
#一个是直接指定要安装的模块或包。另一个使用清单文件指定要安装的模块和包。  
#当应用依赖的模块较多时,建议使用清单文件来列出所依赖的模块。
#依赖包txt文件需要 在包目录的同级目录创建 并 添加文件内容,每一行为一个依赖包名称 如:mysql-connector-python
#2、--target 选项指定将模块安装到指定目录下,此处指定将依赖模块安装到 包目录 即 dbapp子目录下。


#最后,下载依赖包完成后,在dbqpp同级目录 CMD命令行指令运行如下:
#python -m zipapp dbqpp

#该命令没有使用 -m 边项来指定程序入口,该程序将会使用档案包中的 __main__.py 文件作为程序入口。
#运行上面命令,将会得到一个大约为 18MB 的档案包。因为该档案包自包含了 mysql-connector-python 模块,所以比较大。
#而且就算python环境删除了该依赖包,该程勋也可独立运行,因为其打包包含了依赖包。










# =============================================================================
# #pyinstaller模块
# #PyInstaller模块 将 Python 程序生成可直接运行的程序,这个程序就可以被分发到对应的 Windows 或 Mac OS X 平台上运行
# =============================================================================

#pip下载该第三方模块pyinstaller
#pip install pyinstaller
#PyInstaller模块安装成功之后,在 Python 的安装目录下的 Scripts(D:\Python\Python36\Scripts) 目录下会增加一个 pyinstaller.exe 程序,接下来就可以使用该工具将 Python 程序生成 EXE 程序了。


#使用:
#pyinstaller模块 打包exe程序 的命令行语法如下:
#pyinstaller 选项 python源文件


#注意:
#pyinstaller模块 打包exe程序的命令中:
#不管这个Python应用是单文件的应用,还是多文件的应用,只要在使用pyinstaller命令时编译作为程序入口的 Python 程序即可。


#PyInstaller 支持的常用选项:
#-h,--help	                    查看该模块的帮助信息
#-F,-onefile                   	产生单个的可执行文件
#-D,--onedir                 	产生一个目录(包含多个文件)作为可执行程序
#-w,--windowed,--noconsolc	    指定程序运行时不显示命令行窗口(仅对 Windows 有效)


#-a,--ascii	                    不包含 Unicode 字符集支持
#-d,--debug	                    产生 debug 版本的可执行文件
#-c,--nowindowed,--console   	指定使用命令行窗口运行程序(仅对 Windows 有效)
#-o DIR,--out=DIR	            指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
#-p DIR,--path=DIR	            设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
#-n NAME,--name=NAME	        指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

#了解 PyInstaller 选项的详细信息,可通过 pyinstaller -h 来查看。




##########
#示例    
#使用:
#pyinstaller打包exe文件 -F选项 指定打包成单个可执行的exe文件  

#首先,创建 pyinstaller打包exe 目录,该目录下建立一个 app子目录
#app子目录下新建 pyinstaller_say_hello.py 和 app.py

#pyinstaller_say_hello.py
def say_hello(name):
    return str(name) + '你好'

#app.py
from pyinstaller_say_hello import *

def main():
    print('程序开始执行')
    print(say_hello('血皇敖天'))


#然后,运行#pyinstaller模块 打包exe程序 的命令行语法如下:
#pyinstaller -F app.py
    
#最后,打包命令完成后,将看到详细的生成过程。
#当生成完成后,将会在此 app 目录下看到多了一个 dist 目录,并在该目录下看到有一个 app.exe 文件,这就是使用 PyInstaller 工具生成的 EXE 程序。

#通过在命令行窗口中进入 dist 目录下,在该目录执行 app.exe 






##########
#示例    图形用户界面 的应用程序
#使用:
#pyinstaller打包exe文件 -D选项 指定打包生成一个目录(包含多个文件)来作为程序  
#通过结合-w选项不生成命令行界面 及 在代码中结合 tkiner模块构建 来实现图形用户界面程序。


#首先,创建 pyinstaller打包exe 目录,该目录下建立一个 dbapp子目录
#dbapp子目录下新建 pyinstaller_exec_select.py 和 pyinstaller_main.py

#pyinstaller_exec_select.py      程序负责查询数据,
import mysql.connector

def query_db():
    #链接数据库
    conn=mysql.connector.connect(user='root',password='yangshujke5',
                                 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属性获取列信息
    description = c.description
    
    #使用fetchall获取游标中的所有结果集
    rows = c.fetchall()
    
    #关闭游标
    c.close()
    #关闭连接
    conn.close()
    
    return description, rows


#pyinstaller_main.py             程序负责创建图形用户界面来显示查询结果。
from exec_select import *
from tkinter import *
def main():
    description, rows = query_db()
    # 创建窗口
    win = Tk()
    win.title('数据库查询')
    # 通过description获取列信息
    for i, col in enumerate(description):
        lb = Button(win, text=col[0], padx=50, pady=6)
        lb.grid(row=0, column=i)
    # 直接使用for循环查询得到的结果集
    for i, row in enumerate(rows):
        for j in range(len(row)):
            en = Label(win, text=row[j])
            en.grid(row=i+1, column=j)
    win.mainloop()
if __name__ == '__main__':
    main()




#然后,在dbapp目录中执行CMD命令如下:
#pyinstaller -F -w pyinstaller_main.py
    
#上面命令中的 -F 选项指定生成单个的可执行程序,-w 选项指定生成图形用户界面程序(不需要命令行界面)。
#运行上面命令,该工具同样在 dbapp 目录下生成了一个 dist 子目录,并在该子目录下生成了一个 main.exe 文件。
#直接双击运行 main.exe 程序(该程序有图形用户界面,因此可以双击运行)













猜你喜欢

转载自blog.csdn.net/weixin_44015805/article/details/101103620
今日推荐