【python】打包神器--pyinstaller

Tony_xiao發表於2024-09-06
  • 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:程式碼及依賴檔案
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,打包後,依賴檔案放置到可執行檔案同目錄也可以正常執行
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:執行

相關文章