使用配置文件打包Python应用程序

使用配置文件打包Python应用程序,python,configuration-files,packaging,Python,Configuration Files,Packaging,我正在使用ConfigParser来配置我的应用程序,现在我想让它易于分发,同时保持可配置性 我想我需要一个带有配置文件模板的目录,以及一些从这些模板生成实际使用的配置的方法。然后我需要一个可以在virtualenv、用户主目录等中工作的地方来存储它。我希望它与普通Unix软件包的工作方式尽可能接近,即在etc中有config,但在主目录中有覆盖。有现成的解决方案吗?如果没有,我应该在setup.py等中添加什么以使其像我所希望的那样工作?您可以使用distutils选项在任何地方安装文件 da

我正在使用ConfigParser来配置我的应用程序,现在我想让它易于分发,同时保持可配置性

我想我需要一个带有配置文件模板的目录,以及一些从这些模板生成实际使用的配置的方法。然后我需要一个可以在virtualenv、用户主目录等中工作的地方来存储它。我希望它与普通Unix软件包的工作方式尽可能接近,即在etc中有config,但在主目录中有覆盖。有现成的解决方案吗?如果没有,我应该在setup.py等中添加什么以使其像我所希望的那样工作?

您可以使用
distutils
选项在任何地方安装文件

data\u files
按以下方式指定一系列
(目录、文件)
对:

setup(...,
      data_files=[('/etc', ['cfg/config1.ini', 'cfg/config2.ini']),
                  ('/etc/init.d', ['bin/initscript1'])],
      ....
     )
读取应用程序上的配置文件时,可以使用以下方法合并
/home
版本(如果存在):


这将读取
/etc/config1.ini
,然后用用户主目录中的
.config1.ini
中的内容覆盖定义(如果存在)。

有没有办法让virtualenv更好地工作?也就是说,我应该指定什么路径将内容放入myvirtenv/etc/myconf.ini?我知道这是一篇老文章,但仍然有用@JoakimLundborg:您可以使用
sys.prefix
,默认情况下这是
/usr
,并且在您的案例中使用virtualenv的路径(使用sys.real_前缀时,如果在
sys.real_prefix
中使用real prefix,似乎很有希望,那么还需要一种在运行时获取相同位置的方法,以便从那里读取配置文件;是否可以使用相同的方法?
files_read = cfgparserobj.read(['/etc/config1.ini', 
                                os.path.expanduser('~/.config1.ini')])
for fname in files_read:
    print "Reading config from", fname