conda虛擬環(huán)境下使用pyinstaller打包程序?yàn)閑xe文件全過(guò)程
一、為什么要用conda虛擬環(huán)境
第一點(diǎn)是,pyinstaller打包需要指定程序中使用的庫(kù)的路徑,新手在這一點(diǎn)上很容易出現(xiàn)問(wèn)題,導(dǎo)致打包后的exe程序執(zhí)行的時(shí)候顯示缺少模塊。這個(gè)問(wèn)題可能并不能通過(guò)簡(jiǎn)單地指定路徑來(lái)解決。
第二點(diǎn)就是使用虛擬環(huán)境本身的好處了:
- 可以創(chuàng)建多個(gè)不同的Python環(huán)境,每個(gè)環(huán)境可以安裝不同版本的Python和不同的包,避免了包之間的沖突和依賴問(wèn)題。
- 可以方便地切換和管理不同的Python環(huán)境,只需要使用activate和deactivate命令即可。
- 可以使用conda命令來(lái)安裝和更新包,不需要使用pip或其他工具。conda還可以安裝一些非Python的包,比如gcc,nodejs,cuda等。
- 可以使用conda-forge等第三方源來(lái)獲取更多的包,或者使用自定義的源來(lái)安裝私有的包。
- 可以使用conda export和conda env create命令來(lái)導(dǎo)出和導(dǎo)入環(huán)境配置文件,方便在不同的機(jī)器上復(fù)制相同的環(huán)境。
當(dāng)你進(jìn)入一個(gè)conda虛擬環(huán)境后(conda activate xxx),可以使用
conda install和pip install安裝不同的包,因?yàn)槟承┌赡茉赾onda源中沒(méi)有。
虛擬環(huán)境的創(chuàng)建和使用很簡(jiǎn)單,不是本文的主題,這里不贅述了。
二、pyinstaller用法
PyInstaller 是一個(gè)用于將 Python 程序打包成可執(zhí)行文件的強(qiáng)大工具。它允許你將你的 Python 代碼、依賴項(xiàng)和解釋器一起打包成一個(gè)獨(dú)立的可執(zhí)行文件,無(wú)需用戶安裝 Python 或其他依賴項(xiàng)。
2.1 安裝 PyInstaller
首先進(jìn)入項(xiàng)目所在的虛擬環(huán)境:
打開Anaconda Powershell Prompt(為什么不直接用Powershell?可以,但不建議,你可以從我本專欄前面的文章找到答案),進(jìn)入項(xiàng)目所在虛擬環(huán)境:
conda activate yt_dlp_env
安裝pyinstaller:
conda install pyinstaller

現(xiàn)在,先看第三節(jié):實(shí)際使用示例,然后再回來(lái)看第二節(jié)。
2.2 基本用法
打包一個(gè) Python 腳本
假設(shè)你有一個(gè)名為 my_script.py 的 Python 腳本,想將其打包成可執(zhí)行文件。你可以在命令行中執(zhí)行以下命令:
pyinstaller my_script.py
這將在當(dāng)前目錄下創(chuàng)建一個(gè) dist 文件夾,其中包含了可執(zhí)行文件。你可以在 dist 文件夾中找到 my_script(或 my_script.exe,取決于你的操作系統(tǒng))可執(zhí)行文件。
2.21 打包一個(gè) Python 項(xiàng)目
如果你的項(xiàng)目包含多個(gè)文件,你可以將整個(gè)項(xiàng)目目錄作為參數(shù)傳遞給 PyInstaller。例如:
pyinstaller my_project_directory
這將在 dist 文件夾中創(chuàng)建一個(gè)可執(zhí)行文件,其中包含了整個(gè)項(xiàng)目的所有文件和依賴項(xiàng)。
2.22 打包選項(xiàng)
PyInstaller 支持許多選項(xiàng),以便你根據(jù)需要自定義打包過(guò)程。一些常用的選項(xiàng)包括:
打包選項(xiàng):
-F或--onefile:生成單個(gè)可執(zhí)行文件。-D或--onedir:生成一個(gè)包含多個(gè)文件的目錄。-w或--windowed:創(chuàng)建一個(gè)窗口應(yīng)用程序,沒(méi)有控制臺(tái)窗口。-c或--console:創(chuàng)建一個(gè)帶有控制臺(tái)窗口的命令行應(yīng)用程序。-m或--name:指定生成的可執(zhí)行文件的名稱。--add-data:添加額外的數(shù)據(jù)文件到可執(zhí)行文件中。
導(dǎo)入選項(xiàng):
-p或--paths:添加搜索Python模塊的路徑。--hidden-import:指定需要手動(dòng)導(dǎo)入但不在源代碼中明確導(dǎo)入的模塊。
打包配置選項(xiàng):
--name:指定生成的可執(zhí)行文件的名稱。--icon:指定可執(zhí)行文件的圖標(biāo)文件。--version-file:指定版本信息文件。--upx-dir:指定UPX可執(zhí)行文件壓縮工具的目錄。
調(diào)試選項(xiàng):
--debug:生成帶有調(diào)試信息的可執(zhí)行文件。
優(yōu)化選項(xiàng):
-O或--optimize:使用優(yōu)化編譯Python文件。--noconfirm:禁用優(yōu)化編譯確認(rèn)提示。
其他選項(xiàng):
-h或--help:顯示幫助信息。--clean:清理臨時(shí)文件。--noconfirm:在覆蓋現(xiàn)有輸出目錄時(shí)不進(jìn)行確認(rèn)。--noconsole:不顯示控制臺(tái)--python:指定python解釋器的路徑。
這只是一些常用的PyInstaller參數(shù),實(shí)際上有更多選項(xiàng)可用于更復(fù)雜的定制。你可以使用pyinstaller --help命令來(lái)查看完整的參數(shù)列表和說(shuō)明。
例如,要生成一個(gè)單獨(dú)的可執(zhí)行文件并指定其名稱,你可以使用以下命令:
pyinstaller -F -n my_app my_script.py
這將生成一個(gè)名為 my_app 的單獨(dú)可執(zhí)行文件。
2.3 打包依賴項(xiàng)
當(dāng)使用PyInstaller來(lái)打包Python應(yīng)用程序時(shí),你可以使用一系列重要的選項(xiàng)來(lái)設(shè)置依賴項(xiàng)和配置生成的可執(zhí)行文件。以下是一些關(guān)鍵的依賴設(shè)置選項(xiàng):
--hidden-import:通過(guò)該選項(xiàng),你可以指定需要手動(dòng)導(dǎo)入但不在源代碼中明確導(dǎo)入的模塊。這對(duì)于確保PyInstaller能夠識(shí)別和包含所有依賴項(xiàng)非常有用。
pyinstaller --hidden-import module_name script.py
--exclude-module:使用該選項(xiàng)可以排除特定模塊,不包含在生成的可執(zhí)行文件中。
pyinstaller --exclude-module module_name script.py
--add-binary:允許將外部二進(jìn)制文件添加到生成的可執(zhí)行文件中,這對(duì)于包含一些外部庫(kù)非常有用。
pyinstaller --add-binary "path/to/binary;destination/folder" script.py
--add-data:類似于--add-binary,但用于添加外部數(shù)據(jù)文件到生成的可執(zhí)行文件中。
pyinstaller --add-data "path/to/data;destination/folder" script.py
--paths:通過(guò)指定額外的模塊搜索路徑,可以確保PyInstaller能夠找到依賴項(xiàng)的位置。
pyinstaller --paths path/to/modules script.py
你也可以手動(dòng)????
2.31 導(dǎo)出依賴項(xiàng)列表
你可以使用以下命令導(dǎo)出項(xiàng)目的依賴項(xiàng)列表:
pyinstaller --name=my_app --onefile my_script.py --path=/path/to/dependencies
這將創(chuàng)建一個(gè) my_app.spec 文件,其中包含了項(xiàng)目的依賴項(xiàng)列表。
2.32 配置依賴項(xiàng)
編輯 my_app.spec 文件并添加依賴項(xiàng)的路徑,如下所示:
# ...
a = Analysis(['my_script.py'],
pathex=['/path/to/project'],
binaries=[],
datas=[],
...
pathex=['/path/to/dependencies'], # 添加依賴項(xiàng)路徑
...
)
# ...
然后,使用以下命令來(lái)根據(jù)修改后的 my_app.spec 文件打包項(xiàng)目:
pyinstaller my_app.spec
這將使用指定的依賴項(xiàng)路徑打包項(xiàng)目。
2.4 自定義打包選項(xiàng)
如果你需要更多的自定義選項(xiàng),可以編輯 my_app.spec 文件并進(jìn)行更詳細(xì)的配置。你可以設(shè)置各種選項(xiàng),包括文件和目錄的排除和包含、運(yùn)行時(shí)選項(xiàng)等。詳細(xì)信息可以在 PyInstaller 的官方文檔中找到。
2.5 打包完成后的文件
成功打包后,你將在 dist 目錄中找到生成的可執(zhí)行文件。這個(gè)文件可以在沒(méi)有安裝 Python 解釋器或其他依賴項(xiàng)的情況下在目標(biāo)系統(tǒng)上運(yùn)行。
2.6 注意事項(xiàng)
- 打包大?。嚎蓤?zhí)行文件的大小可能會(huì)比原始 Python 代碼大很多,因?yàn)樗?Python 解釋器和依賴項(xiàng)。你可以通過(guò)精簡(jiǎn)依賴項(xiàng)來(lái)減小可執(zhí)行文件的大小。
- 跨平臺(tái)問(wèn)題:PyInstaller 支持在不同的操作系統(tǒng)上打包應(yīng)用程序,但需要在相應(yīng)的操作系統(tǒng)上運(yùn)行 PyInstaller。
三、打包示例
打包如下程序:

(1)打開Anaconda Powershell Prompt,進(jìn)入項(xiàng)目所在虛擬環(huán)境:
conda activate yt_dlp_env
(2)進(jìn)入程序所在目錄:
cd D:\Python_Study\VideoDownload
(3)打包:
pyinstaller -F --paths=E:\anaconda3\envs\yt_dlp_env\Lib\site-packages --python=E:\anaconda3\envs\yt_dlp_env\python.exe --icon=wx2.ico --name=Downloader DLP_GUI_Perfect.py
參數(shù)說(shuō)明:
-F:打包成一個(gè)可執(zhí)行文件;-- path:指定python模塊的搜索路徑;--python:指定python解釋器路徑;--icon:可執(zhí)行文件的圖標(biāo)--name:可執(zhí)行文件名稱
(3)在文件所在目錄,打開dist文件夾,即可看到打包好的exe文件;


(4)直接打開即可運(yùn)行,發(fā)送給別人也是如此(跨平臺(tái)應(yīng)該不行)。

打包好的exe程序運(yùn)行時(shí)是會(huì)打開一個(gè)控制臺(tái)窗口的,有時(shí)候是不需要的,比如你是一個(gè)GUI的程序。
在使用PyInstaller打包時(shí),你可以使用--noconsole選項(xiàng)來(lái)告訴PyInstaller生成一個(gè)窗口應(yīng)用程序而不是控制臺(tái)應(yīng)用程序:
pyinstaller -F --paths=E:\anaconda3\envs\yt_dlp_env\Lib\site-packages --python=E:\anaconda3\envs\yt_dlp_env\python.exe --noconsole --icon=wx2.ico --name=Downloader DLP_GUI_Perfect.py
但不建議第一次就這樣打包,留著控制臺(tái),可以查看程序運(yùn)行報(bào)錯(cuò)情況,因?yàn)橐蕾嚭芏嗟那闆r下,可能存在依賴沒(méi)完全指定的情況。
除了依賴問(wèn)題,還有pyinstaller本身的問(wèn)題,打包后,可能會(huì)改變一些程序的運(yùn)行邏輯或者某個(gè)過(guò)程的編碼、或者資源訪問(wèn)方式等等。不僅需要注意打包參數(shù)的設(shè)置,可能還需要修改源代碼。
因此,需要多次調(diào)試才能打包好一個(gè)程序(復(fù)雜一些的),可以使用--debug參數(shù)打包,進(jìn)行調(diào)試。
總結(jié)
到此這篇關(guān)于conda虛擬環(huán)境下使用pyinstaller打包程序?yàn)閑xe文件的文章就介紹到這了,更多相關(guān)conda虛擬環(huán)境pyinstaller打包exe內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入掌握Python模塊創(chuàng)建導(dǎo)入和使用
這篇文章主要為大家介紹了深入掌握Python模塊創(chuàng)建導(dǎo)入和使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
如何利用python獲取鼠標(biāo)點(diǎn)擊的實(shí)時(shí)位置案例
這篇文章主要給大家介紹了關(guān)于如何利用python獲取鼠標(biāo)點(diǎn)擊的實(shí)時(shí)位置,并展示了如何安裝和使用該庫(kù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
python進(jìn)程的狀態(tài)、創(chuàng)建及使用方法詳解
這篇文章主要介紹了python進(jìn)程的狀態(tài)、創(chuàng)建及使用方法,結(jié)合實(shí)例形式詳細(xì)分析了Python進(jìn)程的概念、原理、工作狀態(tài)、創(chuàng)建以及使用方法,需要的朋友可以參考下2019-12-12
Python實(shí)現(xiàn)讀取文件的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Python中實(shí)現(xiàn)讀取文件效果的幾種方法總結(jié),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09
python 循環(huán)數(shù)據(jù)賦值實(shí)例
今天小編就為大家分享一篇python 循環(huán)數(shù)據(jù)賦值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python之random.sample()和numpy.random.choice()的優(yōu)缺點(diǎn)說(shuō)明
這篇文章主要介紹了Python之random.sample()和numpy.random.choice()的優(yōu)缺點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Python實(shí)現(xiàn)基于標(biāo)記的分水嶺分割算法
分水嶺技術(shù)是一種眾所周知的分割算法,特別適用于提取圖片中的相鄰或重疊對(duì)象。本文將用Python實(shí)現(xiàn)基于標(biāo)記的分水嶺分割算法,感興趣的可以了解一下2022-07-07
Python3 assert斷言實(shí)現(xiàn)原理解析
這篇文章主要介紹了Python3 assert斷言實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Python中表達(dá)式x += y和x = x+y 的區(qū)別詳解
這篇文章主要跟大家介紹了關(guān)于Python中x += y和x = x+y 的區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06
Python實(shí)現(xiàn)Appium端口檢測(cè)與釋放的實(shí)現(xiàn)
這篇文章主要介紹了Python實(shí)現(xiàn)Appium端口檢測(cè)與釋放的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

