Python執(zhí)行程序獲取所在目錄的解決方案
Python執(zhí)行程序獲取所在目錄
工作需要,寫(xiě)一個(gè)小腳本,其中有個(gè)需求是獲取實(shí)際的執(zhí)行程序所在路徑(python代碼由pyinstaller
打包成執(zhí)行程序)。沒(méi)想到這么一個(gè)小要求,淺藏小坑。
方案一
os.path.realpath(os.curdir) os.path.realpath(os.getcwd())
這兩個(gè)命令都可以獲取當(dāng)前命令行的路徑,可是,如果在其它目錄下執(zhí)行程序:
(base) (venv) PS D:\project\pythonProject> .\dist\python.exe
輸出的路徑是命令行當(dāng)前路徑D:\project\pythonProject
而不是執(zhí)行程序所在路徑D:\project\pythonProject\dist
。
方案二
os.path.realpath(os.path.dirname(__file__))
這個(gè)命令獲取有此行代碼的.py
文件位置。直接在pycharm運(yùn)行調(diào)試一切正常。然而,當(dāng)使用pyinstaller
打包程序執(zhí)行后,路徑變成了如下路徑。
C:\Users\Administartor\AppData\Local\Temp\_MEI313522\
一開(kāi)始還沒(méi)找到文件輸出在哪,一番調(diào)查后,可能原因如下:
使用 PyInstaller 打包的可執(zhí)行文件在運(yùn)行時(shí)會(huì)解壓出臨時(shí)文件。這些臨時(shí)文件包含了 Python 腳本、依賴庫(kù)和資源文件等。當(dāng)運(yùn)行打包后的可執(zhí)行文件時(shí),PyInstaller 會(huì)將這些文件解壓到一個(gè)臨時(shí)目錄中,然后從臨時(shí)目錄中執(zhí)行程序。
一般情況下,當(dāng)程序運(yùn)行結(jié)束后,臨時(shí)文件會(huì)被自動(dòng)刪除。這是因?yàn)椴僮飨到y(tǒng)會(huì)在程序退出時(shí)清理臨時(shí)文件。如果程序異常退出,可能會(huì)導(dǎo)致臨時(shí)文件沒(méi)有被刪除。然而,PyInstaller 在打包時(shí)會(huì)盡量保證生成的可執(zhí)行文件能夠自動(dòng)清理臨時(shí)文件,以避免產(chǎn)生垃圾文件。
在 Windows 系統(tǒng)中,臨時(shí)文件通常存儲(chǔ)在用戶的臨時(shí)目錄(例如 C:\Users\<username>\AppData\Local\Temp
)中。在 Linux 和 macOS 等系統(tǒng)中,通常是在 /tmp
目錄中。
OK,破案,一刻也沒(méi)有為__file__
的失敗而哀悼,立刻趕來(lái)戰(zhàn)場(chǎng)的是sys.argv[0]
方案三
os.path.realpath(os.path.dirname(sys.argv[0]))
完美解決問(wèn)題。相關(guān)資料如下:
sys.argv[0]
表示 Python 腳本或者可執(zhí)行文件的路徑。在運(yùn)行 Python 腳本時(shí),sys.argv
是一個(gè)包含命令行參數(shù)的列表,其中 sys.argv[0]
是腳本本身的路徑。
具體來(lái)說(shuō),sys.argv[0]
是一個(gè)字符串,包含了啟動(dòng) Python 解釋器時(shí)用于執(zhí)行腳本的可執(zhí)行文件的路徑。它可以用于獲取腳本所在的目錄或用于構(gòu)建其他路徑。通常情況下,sys.argv[0]
是一個(gè)絕對(duì)路徑,但在某些情況下也可能是相對(duì)路徑。
在使用 pyInstaller
或類似工具將 Python 腳本打包成可執(zhí)行文件時(shí),sys.argv[0]
仍然表示可執(zhí)行文件的路徑,而不是原始 Python 腳本的路徑。
到此這篇關(guān)于Python執(zhí)行程序獲取所在目錄的解決方案的文章就介紹到這了,更多相關(guān)Python獲取所在目錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基本語(yǔ)法之運(yùn)算符功能與用法詳解
這篇文章主要介紹了Python基本語(yǔ)法之運(yùn)算符功能與用法,結(jié)合實(shí)例形式總結(jié)分析了Python常見(jiàn)運(yùn)算符相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-10-10利用Python腳本寫(xiě)端口掃描器socket,python-nmap
這篇文章主要介紹了利用Python腳本寫(xiě)端口掃描器socket,python-nmap,文章圍繞主題展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07關(guān)于Series的index的方法和屬性使用說(shuō)明
這篇文章主要介紹了關(guān)于Series的index的方法和屬性使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06python3對(duì)接mysql數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要介紹了python3對(duì)接mysql數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04解決Jupyter-notebook不彈出默認(rèn)瀏覽器的問(wèn)題
這篇文章主要介紹了解決Jupyter-notebook不彈出默認(rèn)瀏覽器的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Python新版極驗(yàn)驗(yàn)證碼識(shí)別驗(yàn)證碼教程詳解
這篇文章主要介紹了Python新版極驗(yàn)驗(yàn)證碼識(shí)別驗(yàn)證碼,極驗(yàn)驗(yàn)證是一種在計(jì)算機(jī)領(lǐng)域用于區(qū)分自然人和機(jī)器人的,通過(guò)簡(jiǎn)單集成的方式,為開(kāi)發(fā)者提供安全、便捷的云端驗(yàn)證服務(wù)2023-02-02