分:代碼運(yùn)行中的路徑問(wèn)題)
獲取當(dāng)前工作目錄import sys print(sys.path[0])獲取執(zhí)行命令的位置import os print(os.getcwd())python 代碼運(yùn)行路徑問(wèn)題在下載使用別人的代碼進(jìn)行運(yùn)行時(shí)有時(shí)會(huì)遇到路徑問(wèn)題。將自己目前遇到的進(jìn)行分類和總結(jié)。主要分為兩類import相關(guān) open文件相關(guān)問(wèn)題的來(lái)源是IDE和cmd的默認(rèn)工作路徑的差異或模塊搜索路徑不同。即可能是自己和對(duì)方使用的IDE的不同默認(rèn)工作路徑導(dǎo)致的。當(dāng)前工作目錄文件讀寫等相關(guān)操作使用的基本路徑。通過(guò)函數(shù)os.getcwd()獲得通過(guò)函數(shù)os.chdir()改變os.path功能作為對(duì)路徑進(jìn)行操作的模塊注意在cmd下運(yùn)行時(shí) 文件組織 folder file.py python folder/file.py 當(dāng)前工作目錄在父親目錄 python file.py : 當(dāng)前工作目錄在folder下常見(jiàn)問(wèn)題打開(kāi)文件描述符時(shí)出錯(cuò)找不到對(duì)應(yīng)的文件FileNotFoundError: [Errno 2] No such file or directory解決修改要讀寫的文件路徑系統(tǒng)搜索路徑sys.path數(shù)據(jù)類型字符串?dāng)?shù)組 功能確定模塊搜索路徑 初始化系統(tǒng)環(huán)境變量PYTHONPATH 默認(rèn)安裝路徑比如在終端輸入export PYTHONPATH$PYTHONPATH:/home/.../MinkLoc3Dv2常見(jiàn)問(wèn)題import 模塊時(shí)出錯(cuò)需要導(dǎo)入的的代碼不在sys.path中ModuleNotFoundError: No module named解決將對(duì)應(yīng)模塊所在的路徑加入到sys.path中。比如在代碼中加入sys.path.append(‘/home/zs/project/github/minkloc3d/MinkLoc3Dv2’)如果對(duì)應(yīng)模塊在子文件夾下可以通過(guò)在子文件夾下創(chuàng)建init.py文件解決。相當(dāng)于對(duì)子文件目錄升級(jí)為模塊附件資料標(biāo)題os.getcwd()、sys.path[0]、sys.argv[0]和__file__的區(qū)別os.getcwd()、sys.path[0]、sys.argv[0]和__file__的區(qū)別,終于弄清楚了要分清這幾個(gè)的區(qū)別與使用條件實(shí)際測(cè)試一下是最準(zhǔn)確的。設(shè)計(jì)測(cè)試方法一個(gè)主模塊用來(lái)運(yùn)行一個(gè)子模塊用來(lái)被主模塊調(diào)用 主模塊路徑/Users/stephen/Documents/code/test_dir/01test子模塊路徑/Users/stephen/Documents/code/test_dir/02test運(yùn)行模塊的路徑/Users/stephen/Documents/code/test_dir/01test/001_testok 現(xiàn)在編寫兩模塊代碼子模塊 submodule.py import os import sys def child_test(): print(sub os.getcwd():{}.format(os.getcwd())) print(sub sys.path[0]:{}.format(sys.path[0])) print(sub sys.argv[0]:{}.format(sys.argv[0])) print(sub __file__:{}.format(__file__)) if __name__ __main__: chid_test() 主模塊 mainmodule.py import os import sys import submodule def main(): print(main os.getcwd():{}.format(os.getcwd())) print(main sys.path[0]:{}.format(sys.path[0])) print(main sys.argv[0]:{}.format(sys.argv[0])) print(main __file__:{}.format(__file__)) submodule.child_test() if __name__ __main__: main()目錄結(jié)構(gòu)├── 01test │ ├── 001_test # 運(yùn)行目錄 │ └── mainmodule.py # 主模塊 └── 02test └── submodule.py # 被調(diào)用模塊ok 來(lái)看看結(jié)果Traceback (most recent call last): File ../mainmodule.py, line 3, in module import submodule ModuleNotFoundError: No module named submodule我去出現(xiàn)了點(diǎn)小狀況原因是系統(tǒng)找不到該模塊的路徑我們來(lái)人工添加一個(gè)路徑在主模塊中前面添加sys.path.append(‘/Users/stephen/Documents/code/test_dir/02test/’)再來(lái)試試 - -結(jié)果如下main os.getcwd():/Users/stephen/Documents/code/test_dir/01test/001_test main sys.path[0]:/Users/stephen/Documents/code/test_dir/01test main sys.argv[0]:../mainmodule.py main __file__:../mainmodule.py sub os.getcwd():/Users/stephen/Documents/code/test_dir/01test/001_test sub sys.path[0]:/Users/stephen/Documents/code/test_dir/01test sub sys.argv[0]:../mainmodule.py sub __file__:/Users/stephen/Documents/code/test_dir/02test/submodule.py結(jié)合目錄結(jié)構(gòu)看就清楚了├── 01test │ ├── 001_test # 運(yùn)行目錄 │ └── mainmodule.py # 主模塊 └── 02test └── submodule.py # 被調(diào)用模塊 os.getcwd() 指的是運(yùn)行程序的目錄 (絕對(duì)路徑) sys.path[0] 主要模塊的目錄 絕對(duì)路徑 sys.argv[0] 運(yùn)行模塊時(shí)pyhton 后面的參數(shù) __file__ 這個(gè)就有點(diǎn)奇怪了主模塊顯示的相對(duì)路徑而被調(diào)用模塊卻用的絕對(duì)路徑 __file__ 還是有點(diǎn)疑慮于是去 stack overflow(click to)看到了這句話如下 So, if you are outside the part of sys.path that contains the module, youll get an absolute path. If you are inside the part of sys.path that contains the module, youll get a relative path. If you load a module in the current directory, and the current directory isnt in sys.path, youll get an absolute path. If you load a module in the current directory, and the current directory is in sys.path, youll get a relative path.意思大致是如果你(你所在的當(dāng)前目錄)不在sys.path的范圍里你會(huì)得到絕對(duì)路徑反之你會(huì)得到相對(duì)路徑如果你在當(dāng)前目錄加載模塊并且當(dāng)前目錄在sys.path 里 你會(huì)得到相對(duì)路徑。對(duì)比上面的結(jié)果符合。不過(guò)我們還是應(yīng)該再來(lái)驗(yàn)證下。我們把當(dāng)前路徑換到子模塊下├── 01test │ ├── 001_test │ └── mainmodule.py # 主模塊 └── 02test # 當(dāng)前目錄 └── submodule.py # 被調(diào)用模塊結(jié)果如下main os.getcwd():/Users/stephen/Documents/code/test_dir/02test main sys.path[0]:/Users/stephen/Documents/code/test_dir/01test main sys.argv[0]:../01test/mainmodule.py main __file__:../01test/mainmodule.py sub os.getcwd():/Users/stephen/Documents/code/test_dir/02test sub sys.path[0]:/Users/stephen/Documents/code/test_dir/01test sub sys.argv[0]:../01test/mainmodule.py sub __file__:/Users/stephen/Documents/code/test_dir/02test/submodule.py是不是覺(jué)得有問(wèn)題幸虧我們測(cè)試了突然想起我我運(yùn)行mainmodule用的相對(duì)路徑像這樣$ python …/01test/mainmodule.py然后__file__就是相對(duì)路徑的如果我們換成絕對(duì)路徑呢$ python /Users/stephen/Documents/code/test_dir/01test/mainmodule.py結(jié)果如下main os.getcwd():/Users/stephen/Documents/code/test_dir/02test main sys.path[0]:/Users/stephen/Documents/code/test_dir/01test main sys.argv[0]:/Users/stephen/Documents/code/test_dir/01test/mainmodule.py main __file__:/Users/stephen/Documents/code/test_dir/01test/mainmodule.py sub os.getcwd():/Users/stephen/Documents/code/test_dir/02test sub sys.path[0]:/Users/stephen/Documents/code/test_dir/01test sub sys.argv[0]:/Users/stephen/Documents/code/test_dir/01test/mainmodule.py sub __file__:/Users/stephen/Documents/code/test_dir/02test/submodule.pysoga!終于弄清楚了突然有種小興奮啊總結(jié)一下os.getcwd() 指的是當(dāng)前目錄絕對(duì)路徑 sys.path[0] sys.path 指的是pathsys.path[0]為主模塊目錄的絕對(duì)路徑在模塊運(yùn)行的時(shí)候被自動(dòng)添加進(jìn)去 sys.argv[0] 就是你運(yùn)行時(shí) python 后面跟的參數(shù) __file__ 表示所在模塊文件的路徑和系統(tǒng)找到該模塊的方式有關(guān)你是用絕對(duì)路徑去加載該模塊那么__file__就為絕對(duì)模塊文件路徑如果你給系統(tǒng)提供相對(duì)路徑去加載該模塊那么改文件路徑為相對(duì)路徑案例demo自己的工程代碼修改了自己的代碼然后單卡上能跑到自己修改的代碼但是多卡訓(xùn)練的時(shí)候就跑不到自己修改的代碼像是跑到了pip安裝的庫(kù)。原因是需要加上下面的代碼注一在終端或者~/.bashrc里直接添加PYTHONPATH/data/perception/bev/adb/adb_code/ADB_DLA:$PYTHONPATH不管用_p os.environ.get(“PYTHONPATH”, “”)os.environ[“PYTHONPATH”] “/data/perception/bev/adb/adb_code/ADB” (os.pathsep _p if _p else “”)importos os.chdir(os.path.dirname(__file__))importsys sys.path.insert(0,/data/perception/bev/adb/adb_code/ADB)# 多卡 DDP 子進(jìn)程由 torchrun 拉起需能 import 本地 ultralytics非 pip 安裝通過(guò) PYTHONPATH 傳遞_pos.environ.get(PYTHONPATH,)os.environ[PYTHONPATH]/data/perception/bev/adb/adb_code/ADB(os.pathsep_pif_pelse)