簡體   English   中英

對在Python中使用相對路徑和絕對路徑感到困惑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM