2010-01-08 64 views
14

我正在使用ConfigParser來配置我的應用程序,現在我想使它容易分配,並且同時保留可配置性。使用配置文件打包Python應用程序

我在想我需要一個帶有配置文件模板的目錄,還有一些生成配置的方法可以從這些配置文件中實際使用。然後,我需要一個地方來存儲它,這將在virtualenv,用戶主目錄等工作。我希望它是如何接近正常的Unix軟件包工作,即有配置等,但在主目錄覆蓋。有沒有一個現成的解決方案,如果不是,我應該把我的setup.py等,使它像我想要的那樣工作?

回答

9

您可以使用data_files選項distutils來隨時隨地安裝文件。

data_files指定(directory, files)對以下列方式順序:

setup(..., 
     data_files=[('/etc', ['cfg/config1.ini', 'cfg/config2.ini']), 
        ('/etc/init.d', ['bin/initscript1'])], 
     .... 
    ) 

當閱讀你的應用程序配置文件,您可以合併一個/home版本,如果它存在,使用.read() method of ConfigParser objects

files_read = cfgparserobj.read(['/etc/config1.ini', 
           os.path.expanduser('~/.config1.ini')]) 
for fname in files_read: 
    print "Reading config from", fname 

這將讀取/etc/config1.ini,然後覆蓋用戶主目錄中來自.config1.ini的內容(如果存在)的定義。

+6

有沒有辦法讓這個工作很好用virtualenv?即我應該指定什麼路徑將東西放在myvirtenv/etc/myconf.ini中? – 2010-01-08 14:38:14

+4

我知道這是一箇舊帖子,但仍然可以是有用的。 @JoakimLundborg:你可以使用''sys.prefix'',默認是''/ usr'',你的virtualenv的路徑(在''sys.real_prefix''中有真實的前綴' – linkdd 2014-05-03 00:55:09

+0

'使用sys .real_prefix看起來非常有前途,它還需要一種方法來在運行時獲取相同的位置以便從那裏讀取配置文件;可以將相同的位置用於此目的嗎? – a1an 2016-11-18 10:34:56