一、使用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的名字 |