[英]Confused about using relative and absolute path in Python
我有一個名為“ test.py”的腳本,它引用一個名為“ cfg.yaml”的配置文件。 這兩個位於同一目錄中,稱為“ test / scripts”。
test/scripts/test.py
test/script/cfg.yaml
現在,我在“ test / data1 / data2”中編寫了一個名為task.sh的bash腳本。
從task.sh內部,我想調用python腳本
test.sh的內容如下:
#!/bin/sh
python ../../scripts/test.py
test.py會像open(“ cfg.yaml”)一樣打開並讀取cfg.yaml,但是當調用test.sh時,它將失敗,因為“ cfg.yaml”未使用相對路徑進行引用。 我該如何解決?
嘗試
#!/bin/sh
cd ../../scripts
python test.py
我假設在test.py中,您使用本地路徑引用yaml,該路徑期望腳本從scripts目錄運行(而不是從data1/data2
)
print os.getcwd()
您始終可以在運行python腳本時print os.getcwd()
來查看您的工作目錄(或者只是bash中的pwd
)
如果要使用相對於腳本的相對位置來引用文件,則不能僅使用相對路徑,因為腳本可能不在當前工作目錄中。 實際上,根據您的情況,可以保證它不在當前工作目錄中。
通常的快捷和骯臟的解決方案是顯式獲取腳本路徑:
import os
import sys
scriptdir = os.path.abspath(os.path.dirname(sys.argv[0]))
sys.argv[0]
是腳本的全名-在大多數平台上,它表示絕對路徑或相對路徑,目前至少仍然有效。 如果您擔心其他平台,則可能需要查看__file__
。 當然,如果您是用zip文件或類似文件運行腳本,那么這兩個腳本都不會有用。
open(os.path.join(scriptdir, "cfg.yaml"))
(或者,如果您願意,甚至可以強制使用os.chdir(scriptdir)
,但是如果您例如接受用戶的路徑名,那可能是個壞主意。)
正確的解決方案是編寫要安裝的腳本和數據文件(即使您實際上沒有安裝任何東西並在源代碼樹中運行它),然后使用pkg_resources
查找數據文件。 那也將為您解決很多其他問題,但是它確實需要更多的學習知識。 如果您想在那條道路上入門,請參閱《 Python打包用戶指南》 ,並將Package Data和Data Files作為特定的起點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.