2014-12-11 77 views
0

我有一個名爲「test.py」的腳本,並且引用了一個名爲「cfg.yaml」的配置文件。這兩個駐留在同一個名爲「test/scripts」的目錄中。在Python中使用相對和絕對路徑的困惑

test/scripts/test.py 
test/script/cfg.yaml 

現在我正在寫「測試/數據1 /數據2」之稱task.sh

從task.sh內內bash腳本,我想要的python腳本

通話

test.sh內容如下:

#!/bin/sh 

python ../../scripts/test.py 

test.py打開和讀取cfg.yaml像打開( 「cfg.yaml」),但是當test.sh被調用時,它失敗,因爲「CFG。 yaml「不被相對pa引用日。我該如何解決這個問題?

+0

1.您可以從test/scripts運行test.py,2.在test.py中,您可以將cfg文件的路徑更改爲'../../scripts/test.py'或3.您可以使用cfg文件的絕對路徑。發生這種情況是因爲python解釋器正在從test/data1/data2中調用 – rivu 2014-12-11 01:00:13

+0

相對路徑是相對於當前工作目錄的,而不是相對於正在執行的文件的位置 – mehtunguh 2014-12-11 02:19:26

回答

0

嘗試

#!/bin/sh 

cd ../../scripts 
python test.py 

我承擔你引用與期望腳本從腳本目錄運行(而不是從data1/data2

爲預留本地路徑YAML test.py你總是可以用print os.getcwd()看看你的工作目錄是在運行python腳本的時候(或者只是pwd在bash中)

+0

我喜歡你的解決方案最好!謝謝喬蘭。我不知道我可以直接從bash腳本內部執行Python腳本。它工作正常。 – user2921139 2014-12-11 22:19:43

0

如果你想引用一個文件的相對位置添加到腳本,您不能僅爲此使用相對路徑,因爲腳本可能不在當前工作目錄中。事實上,在你的情況下,它保證不是在當前工作目錄。

通常的快速&骯髒的解決方案是明確的將腳本路徑:

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 Packaging User Guide,並以Package Data and Data Files作爲特定的起點。