[問題] 獲取.py檔路徑的方法差異(1000p)

看板Python作者 (QQ)時間6年前 (2018/05/03 18:33), 6年前編輯推噓6(6012)
留言18則, 7人參與, 6年前最新討論串1/1
請問一下,下面這兩種獲取當前路徑的寫法 PATH_1 = os.getcwd().replace('\\','/')+'/log' PATH_2 = './log' 這兩個path的差別是? 詳細請看我下面的過程,謝謝! ------------------------------------------------ 假設我現在有某個test.py檔,路徑為【C:/user/Desktop/folder/test.py】 而folder內除了有test.py,裡面還有一個叫作log的資料夾 即 folder ─┬→ test.py │ └→ log 而test.py裡面內容為: import os import numpy as np PATH_1 = os.getcwd().replace('\\','/')+'/log' PATH_2 = './log' arr = np.zeros(3) np.save(PATH_1+"/1.npy", arr) np.save(PATH_2+"/2.npy", arr) 則運行後會發現: (1) print(PATH_1) 顯示為 C:/user/Desktop/folder/log print(PATH_2) 顯示為 ./log (2) log資料夾中確實有 1.npy 與 2.npy這個檔案 由(1),(2)可知,即便字串是不同的,但是code運行到np.save時,看到"./"會自動改成 當前路徑,並非只是字串的"./" 是否可以推論,要不要把"./"看成當前路徑而不是字串的"./",單純看該package的設定? ------------------------------------------------------------------------- 會這麼問是因為我有一份code在運行時 os.makedirs(PATH) shutil.rmtree(PATH) np.savetxt(PATH,file) plt.imsave(PATH,file) 以上這四個對於我PATH是寫PATH_1形式或是PATH_2形式都是一樣且成功的 但是! embedding.metadata_path = PATH embedding.sprite.image_path = PATH summary_writer = tf.summary.FileWriter(PATH) 上面這三個跟tensorboard(tensorflow的工具)有關的指令 PATH 是 PATH_1形式的話 → 運行成功 PATH 是 PATH_2形式的話 → 運行失敗 也因此才會有這篇問題...@@ ------------------------------------------------- 文有點多,第一個解惑的板友1000p奉上,感謝! 目前我是猜測原因是tensorflow並沒有把字串"./"翻譯成當前路徑 但是"./"的解釋會根據package不同而不同倒也是蠻奇怪的@@ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.128.169.29 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1525343620.A.0B9.html

05/03 20:26, 6年前 , 1F
感覺是目前的位置跑掉了 所以用絕對路徑才能確保無誤
05/03 20:26, 1F
同時問樓上F大跟樓下S大 "."不是指 .py檔所在路徑 嗎 這還算是《相對路徑》? 因為像是os.getcwd() 不也是get current working directory 同樣都是《獲取module所在位址》 為什麼"."算是相對? 補充: 爬google後,好像"相對"的定義就是沒有"完整位址" 雖然"."是指當前,但是不會有確切位址的字串所以把他歸類在"相對"

05/03 21:16, 6年前 , 2F
養成習慣,都用絕對路徑就沒問題
05/03 21:16, 2F

05/03 21:18, 6年前 , 3F
路徑的組合不要直接+ 都用os.path.join
05/03 21:18, 3F

05/03 21:18, 6年前 , 4F
或是py3的pathlib
05/03 21:18, 4F

05/03 21:19, 6年前 , 5F
這樣linux windows都能夠正確執行
05/03 21:19, 5F

05/03 22:07, 6年前 , 6F
你的問題漂亮到讓我以為是教學文(大推
05/03 22:07, 6F
這...上個色而已^^"

05/03 23:51, 6年前 , 7F
回Sunal 我自己有點懶的用os.path.join
05/03 23:51, 7F

05/03 23:52, 6年前 , 8F
不管是Linux 或是windows 一律用 /
05/03 23:52, 8F

05/04 00:42, 6年前 , 9F
如果要用py檔路徑的話 可以用__file__搭配os.path.join
05/04 00:42, 9F

05/04 00:42, 6年前 , 10F
這樣就不會錯~
05/04 00:42, 10F

05/04 09:51, 6年前 , 11F
PATH1是絕對路徑,PATH2是指當下.py的路徑,沒加./應該也行
05/04 09:51, 11F
是的 np.save("1.npy", arr) 可以我知道 而且他是相對路徑 但是 np.save("./1.npy", arr) 我會把它認為是 "." + "/1.npy" 而"." = os.getcwd() = 獲取當前位址 但是以字串來說,上面的等式是不相同的 或許應該理解成"1.npy" 跟 "./1.npy"根本就是等價 ------------------------------------------------------------------- 關於本問題,目前發現問題出在tensorflow本身的設定 embedding.metadata_path embedding.sprite.image_path 這兩個的預設路徑並非是跟隨運行當中的.py路徑 所以才會有問題 謝謝以上給建議的板友,每人200p表示謝意回家發,謝謝! ※ 編輯: znmkhxrw (219.87.142.254), 05/04/2018 10:02:30

05/04 10:02, 6年前 , 12F
運行失敗的error msg是什麼?
05/04 10:02, 12F

05/04 10:04, 6年前 , 13F
. 在windows就是指當下path,在cmd下打dir最前面就是 .
05/04 10:04, 13F

05/04 10:05, 6年前 , 14F
在linux有些情況你必須指明用./xxx 例如它是個執行檔
05/04 10:05, 14F

05/04 10:05, 6年前 , 15F
不過你遇到的狀況不確定是為什麼…
05/04 10:05, 15F

05/04 11:24, 6年前 , 16F
os.getcwd() 是絕對路徑哦
05/04 11:24, 16F

05/04 13:24, 6年前 , 17F
我理解是在路徑敘述中 單純"."是當下資料夾 ".."上一層
05/04 13:24, 17F

05/04 13:24, 6年前 , 18F
資料夾 然後/是當分段看 所以./就會是當前路徑往下跑
05/04 13:24, 18F
文章代碼(AID): #1QwkM42v (Python)