在使用 pyinstaller
打包 Python 應用程式為單個可執行檔案(.exe)時,如果你的專案包含位於不同目錄中的 Python 檔案(模組或包),你需要確保 pyinstaller
能夠正確地找到幷包含這些依賴檔案。這通常透過以下幾種方式實現:
1. 使用 -p
或 --paths
選項指定額外的搜尋路徑
如果你的專案依賴於不在當前工作目錄或標準庫路徑中的模組,你可以使用 --paths
(或 -p
)選項來新增額外的搜尋路徑。例如,如果你的專案結構如下:
my_project/ | |
│ | |
├── main.py | |
│ | |
└── modules/ | |
└── mymodule.py |
你可以在命令列中這樣呼叫 pyinstaller
:
pyinstaller --paths=./modules main.py |
注意,這僅新增了搜尋路徑,確保 pyinstaller
可以在分析階段找到這些模組。但是,如果你的模組內部有進一步的依賴(如 __init__.py
檔案或子模組),pyinstaller
通常能夠自動處理這些依賴,只要它們被正確地引用。
2. 使用 .spec
檔案進行更細緻的配置
對於更復雜的專案,或者當你需要更多的配置選項時,你可以建立一個 .spec
檔案來指定打包的詳細引數。透過編輯 .spec
檔案,你可以新增額外的資料檔案、隱藏匯入、排除特定模組等。
首先,使用 pyinstaller
的 --specpath
選項(如果你需要)來指定 .spec
檔案應該被建立的位置,然後使用 --onefile
或 --onedir
等選項來生成 .spec
檔案:
pyinstaller --onefile --specpath=./specs main.py |
這將建立一個 main.spec
檔案。接下來,你可以編輯這個 .spec
檔案,在 Analysis
類中新增額外的路徑或檔案。例如,你可以修改 datas
和 hiddenimports
列表來包含你的專案需要的額外檔案或隱藏的匯入。
3. 確保 Python 指令碼中的模組引用是正確的
最後,但同樣重要的是,確保你的 Python 指令碼中的模組引用是正確的。如果你的模組位於子目錄中,確保使用正確的包匯入語法。例如,如果 main.py
需要匯入 modules
目錄下的 mymodule.py
,你應該在 main.py
中這樣寫:
from modules import mymodule |
而不是嘗試使用相對或絕對檔案路徑直接匯入 Python 檔案。
總結
透過使用 --paths
選項、編輯 .spec
檔案以及確保正確的模組引用,你應該能夠使用 pyinstaller
將包含不同目錄中 Python 檔案的專案打包成單個可執行檔案。如果問題仍然存在,請檢查 pyinstaller
的輸出日誌,看是否有關於缺失模組或檔案的錯誤訊息,並根據這些訊息調整你的打包配置。
如果你希望在使用 pyinstaller
打包 Python 應用程式為 .exe
檔案時,不顯示控制檯視窗(即 GUI 應用程式執行時不會開啟命令列視窗),你可以使用 --windowed
或 --noconsole
引數。這兩個引數在 pyinstaller
中是等價的,都會指示打包器建立一個沒有控制檯視窗的應用程式。
在你的例子中,如果你想在新增額外搜尋路徑的同時確保不顯示控制檯,你可以這樣做:
pyinstaller --paths=./modules --windowed main.py |
或者
pyinstaller --paths=./modules --noconsole main.py |
這兩個命令都會將 ./modules
目錄新增到 Python 模組的搜尋路徑中,並且建立一個沒有控制檯視窗的 .exe
檔案。
注意,如果你的應用程式實際上是一個需要控制檯輸入的命令列工具,那麼使用 --windowed
或 --noconsole
引數可能會導致你的應用程式無法正常工作,因為控制檯視窗被禁用了。這些引數僅適用於 GUI 應用程式或那些不需要控制檯互動的應用程式。