在一個程序中,顯然受到Java處理方式的影響,我想從解釋程序的PYTHONPATH中的一個目錄中讀取一個靜態文件(實際上是一個日誌配置文件)。我知道我可以做這樣的事情:從PYTHONPATH打開文件
import foo
a = foo.__path__
conf = open(a[0] + "/logging.conf")
,但我不知道這是做事情的「Python化」的方式。我怎樣才能以我的應用程序不需要外部配置來讀取它的方式來分發日誌記錄配置文件?
在一個程序中,顯然受到Java處理方式的影響,我想從解釋程序的PYTHONPATH中的一個目錄中讀取一個靜態文件(實際上是一個日誌配置文件)。我知道我可以做這樣的事情:從PYTHONPATH打開文件
import foo
a = foo.__path__
conf = open(a[0] + "/logging.conf")
,但我不知道這是做事情的「Python化」的方式。我怎樣才能以我的應用程序不需要外部配置來讀取它的方式來分發日誌記錄配置文件?
在一般情況下,這很好,但我不知道你想a[0]
以上(這將只是給你的路徑的第一個字符),你應該使用os.path.join
,而不是隻是追加/
是跨平臺兼容。您可以考慮制定路徑規範,即os.path.abspath(os.path.dirname(foo.__path__))
。請注意,如果__path__
處於壓縮文件或其他導入技巧正在使用中,它將不起作用,但我不擔心這一點(對於Python中的主程序這樣做並不正常,與Java不同)。
如果您確實想要支持壓縮文件,那麼可以使用pkg_resources,但目前有些不推薦使用(我在新的packaging模塊中沒有看到相應的API)。
感謝您的回答。我主要是在尋找確認我的方法足夠Pythonic,所以我沒有太在意代碼本身。 – 2011-06-09 16:28:35
下面是基於尼克斯發佈upthread的鏈接,但寫在一個更實用的風格一個片段:
def search_path(pathname_suffix):
cands = [os.path.join(d,pathname_suffix) for d in sys.path]
try:
return filter(os.path.exists, cands)[0]
except IndexError:
return None
看到這個博客:http://dotnot.org/blog/archives/2004/03/06/ find-a-file-in-pythons-path/ – Nix 2011-06-08 13:01:21