瘋狂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的名字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章