- 1:簡介
-
pyinstaller是一個python的第三方庫,它能夠在Windows、Linux、 Mac OS 等作業系統下將 Python 原始檔打包,透過對原始檔打包, Python 程式可以在沒有安裝 Python 的環境中執行,也可以作為一個獨立檔案方便傳遞和管理。在Windows上使用就打包成.exe檔案。在Mac上使用就打包成mac app。
-
在Windows中打的包,只能在Windows中使用,在Mac中打的包只能在Mac中使用
-
最好配合虛擬環境使用
-
- 環境crm
- python.exe
- Scripts
- pip.exe
- pyinstaller.exe
- Lib
- site-package
- requests
- flask
- pyinstaller
- 2.多檔案打包
- 2.1:安裝pyinstaller,pip install pyinstaller
- 2.2:寫一個簡單指令碼
import requests
pram = {
'query':"哈哈",
}
url = 'https://www.sogou.com/web'
response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)
input('按Enter鍵結束任務.....')
-
2.3:終端執行,pyinstaller -D demo.py,執行完成後,會生成下面幾個檔案,dist資料夾下,就會生成我們需要的exe執行檔案
-
2.4:執行結束後,將dist下面的檔案打包給其他人,直接點選可執行檔案即可執行。
-
3.單檔案打包
- 3.1:上面的打包,會生成很多檔案,dist下面的所有檔案必須一起打包給別人才能執行,這樣比較麻煩,如果能夠打包成一個可執行檔案,就會更方便了。
- 3.2:終端執行,pyinstaller -F demo.py
- 3.3: 注意,**打包成一個檔案,並不代表只是單獨的一個檔案,當我們執行程式時,也會臨時生成多個檔案,只是執行完就刪除了,我們無感知
-
4.路徑問題,如果我們的程式碼需要依賴其它檔案,處理方法
- 4.1:多檔案打包
- 4.1.1:程式碼及依賴檔案
- 4.1:多檔案打包
import requests
import os
pram = {
'query':"哈哈",
}
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(BASE_DIR, "info.txt")) as f:
data = f.read()
url = data.strip()
response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)
input('按Enter鍵結束任務.....')
- 4.1.2:打包後,直接將依賴檔案放到 _internal資料夾中
- 4.2:單檔案打包
- 4.2.1:單檔案打包後,無論怎麼放置依賴檔案都不行,看下面的報錯資訊,這就是我們上文所提到的臨時目錄,這裡找不到info.txt所以報錯
- 4.2.2:這裡有幾種解決方法
- 1):取巧,將依賴檔案放置到D盤固定目錄下,指令碼中也修改為固定路徑,缺點:資料與程式碼分開,不便於管理
- 2):sys.argv[0]表示程式碼本身檔案路徑
- 修改路徑:BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
- 打包後,將依賴檔案放到可執行檔案同目錄即可
- 3):frozen,打包後,依賴檔案放置到可執行檔案同目錄也可以正常執行
- 4.2.1:單檔案打包後,無論怎麼放置依賴檔案都不行,看下面的報錯資訊,這就是我們上文所提到的臨時目錄,這裡找不到info.txt所以報錯
import sys
if getattr(sys, 'frozen', False): # True
print('running in a PyInstaller bundle') # 使用pyinstaller執行
else: # False
print('running in a normal Python process') # python正常的檔案
import sys
import requests
import os
pram = {
'query':"哈哈",
}
# BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
if getattr(sys, 'frozen', False):
# pyinstaller開啟
BASE_DIR = os.path.dirname(sys.executable)
else:
# py檔案路徑
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# https://www.sogou.com/web
with open(os.path.join(BASE_DIR, "info.txt")) as f:
data = f.read()
url = data.strip()
response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)
input('按Enter鍵結束任務.....')
- 5.基於反射的動態模組載入
- 5.1:目錄及指令碼
- 5.2:這裡我們在打包時,pyinstaller是不可能自動幫你選擇模組的
- 5.3:打包
- 5.4:基於配置檔案打包,第3步中打包後,刪除其它檔案,保留spec檔案即可
- 5.5:執行
- 5.1:目錄及指令碼