1. 程式人生 > 其它 >2022-04-12日覆盤

2022-04-12日覆盤

打包

# 安裝
pip install pyinstaller

1.exe打包

  • 支援,win/mac

    • win 平臺上只能打windows的包;
    • mac 上只能打出 mac 的程式;
  • 一般打包的時候結合虛擬環境進行打包;

  • 專案開發步驟

    • 建立虛擬環境

    • 開發 。。。

    • # 開發完畢
      pip freeze > requirements.txt
      
    • 如果是其他平臺的需求,安裝虛擬機器(mac),匯入依賴包

      pip install -r requirements.txt
      
    • 打包

      Pyinstaller -F xxxx
      
    • 產出 demo.exe;

    • 注意:如果不需要跨平臺,可以直接進行打包;

  • 命令總覽

2.多檔案打包

說明:多檔案打包指的是生成多個檔案;

# 命令
pyinstaller -D app.py

3.單檔案打包

說明:單檔案打包指的是生成單個檔案;

# 命令
pyinstaller -F app.py

dist目錄下僅一個檔案,為app.exe;

4.檔案路徑

使用多檔案進行打包,並使用- n指定名稱;

import time
text=input("請輸入>>>")
print(text)
with open('account.txt','r',encoding='utf8')as fp:
    data=fp.read()
print(data)

使用改方法的時候,執行的時候會報錯,因此我們需要使用os模組進行抽取,也可以實現程式碼的解耦,實現開閉原則。

BASE_DIR=os.path.dirname(os.path.abspath(__file__))

# v=os.path.abspath(__file__) # 獲取指令碼檔案所在的物理路徑 >>> E:\newpythoncode\bilibili\app.py
print(BASE_DIR) # E:\newpythoncode\bilibili 
# dirname:去掉檔名,返回上級目錄

修改原來的程式

備註:當程式出現錯誤的時候會直接進行終止程式,強行退出;

import time
import os

BASE_DIR=os.path.dirname(os.path.abspath(__file__))

text=input("請輸入>>>")
print(text)
# 使用os.path.join()進行拼接。
with open(os.path.join(BASE_DIR,'account.txt'),'r',encoding='utf8')as fp:
    data=fp.read()
print(data)

多檔案打包時一般不報錯。

單檔案打包時會報錯,因為單檔案打包的檔案執行的時候會將程式進行解壓。隨後會在解壓的(執行時的臨時目錄)檔案中進行尋找;

import sys

print(sys.argv)
>>> ['E:/newpythoncode/bilibili/test.py'] 
# sys.argv[0]   'E:/newpythoncode/bilibili/test.py'

輸出 python 直譯器後的目錄,打包後表示 exe 檔案的所在檔案;

import sys
import os

print(sys.argv[0])
# realpath() 找到當前路徑的絕對路徑
print(os.path.realpath(sys.path[0]))

補充:

使用上述過程依舊報錯,可能是由於版本等問題,此時可以在配置檔案中進行修改,然後重新打包;

點選檢視 : 參考文章

datas=[
    ('account.txt','.')# 檔名,後面猜測是相對的路徑;
]
# 執行命令
pyinstaller -D 哈哈哈.spec
# >>> 生成目錄中會直接包含檔案

執行成功

5.匯入自定義包

導包一般有兩種情況 : 普通導包動態匯入

5.1 預設匯入

說明:在導包的時候不管是直接匯入的,還是間接(匯入包中的匯入)都會直接進行匯入;不會出現異常;

5.2 動態匯入

import importlib

# from utils.db import get_db
from utils.encrypted import md5

print("------開始執行--------")
pk=importlib.import_module("utils.db") 

res=pk.get_db()
print(res)
data=md5()
print(data)

input("按回車鍵退出>>>")

說明:此匯入包的方式一般會結合這反射進行使用,從而使得 python 的配置檔案更好的遵循開閉原則,從而降低程式碼之間的耦合度。

此時會報錯,因為動態匯入的時候就需要識別程式,所以我們可以在配置檔案哈哈哈.spec中進行手動新增。

# 執行命令
pyinstaller -D 哈哈哈.spec # 自己需要指定配置檔案;

配置後正常執行。

6.補充

  • 生成圖示

    # 需要 img.ico 檔案
    # 指定檔案的路徑即可
    pyinstall -i img.ico -n name -w -D main.py
    

    其他的功能的新增可以參考命令中的提示!

  • 說明

    打包,最常用於是打包桌面程式(pyqt5),控制檯程式一般很少使用;

    控制檯一般用於某些指令碼的執行,例如,爬蟲指令碼,直接交給使用者執行即可;

大江東去,浪淘盡,千古風流人物。