2011-09-27 113 views
43

在發展模式,我有以下目錄樹:在Python中放置配置文件的位置?

| my_project/ 
| setup.py 
| my_project/ 
    | __init__.py 
    | main.py 
    | conf/ 
     | myproject.conf 

我用ConfigParser解析myproject.conf文件。

在我的代碼,很容易將文件加載具有良好的路徑:my_project/conf/myproject.conf

的問題是:當我使用setup.py安裝我的項目,配置文件位於(感謝的setup.py )在/etc/my_project/myproject.conf和我的申請/usr/lib/python<version>/site-packages/my_project/

我如何可以參考我的my_project/conf/myproject.conf文件在我的「生產」模式的項目,並參考「devel的」模式中的本地文件(my_project/conf/myproject.conf)。

此外,如果可能的話,我希望是便攜式的(例如在Windows上工作)。

有什麼好的做法呢?

回答

32

您是否看過配置文件的工作方式?閱讀「rc」文件,因爲它們有時被稱爲。 「bashrc」,「vimrc」等。

通常對配置文件進行多步搜索。

  1. 本地目錄。 ./myproject.conf

  2. 用戶的主目錄(~user/myproject.conf

  3. 一個標準的全系統目錄(/etc/myproject/myproject.conf

  4. 由環境變量命名的地方(MYPROJECT_CONF

的Python安裝將是最後看的地方。

config= None 
for loc in os.curdir, os.path.expanduser("~"), "/etc/myproject", os.environ.get("MYPROJECT_CONF"): 
    try: 
     with open(os.path.join(loc,"myproject.conf")) as source: 
      config.readfp(source) 
    except IOError: 
     pass 
+2

但是,這不是它在Windows中的工作方式,但是,要求提出問題。 – endolith

+1

這將「在窗口上工作」。它可能不是Windows的「典型」,但它確實有效。 –

+1

呃 - 你爲什麼試着用一句話來說明一下? – David

1

我不認爲有一個乾淨的方式來處理這個問題。您可以簡單地選擇測試是否存在「本地」文件,該文件可以在開發模式下工作。否則,回退到生產路徑:

main_base = os.path.dirname(__file__) 
config_file = os.path.join([main_base, "conf", "myproject.conf"]) 

if not os.path.exists(config_file): 
    config_file = PROD_CONFIG_FILE # this could also be different based on the OS 
9

appdirs包在爲各種平臺上的已安裝應用程序查找標準位置方面做得很好。我想知道是否將它擴展到發現或允許開發人員進行某種「卸載」的狀態是有道理的。

2

另一種選擇是將所有.cfg.ini文件保存在主目錄中,如「boto」。

import os.path 
config_file = os.path.join(os.path.expanduser("~"), '.myproject') 
相關問題