10

假设我们有一个名为foo.

如果使用绝对路径:

setup(...,
      data_files=[...,
              ('/etc', ['foo.cfg'])]
)

然后foo$ python setup.py --prefix=/usr/local,我们将拥有/etc/foo.cfg. /usr/local/etc/foo.cfg但是根据FHS我们应该有。

如果我们使用相对路径呢?

setup(...,
      data_files=[...,
              ('etc', ['foo.cfg'])]
)

那么如果我们使用默认的安装路径,即安装到/usr,我们将拥有/usr/etc/foo.cfg. 又倒霉了。

那么怎么做才对呢?

PS为了避免问题更加复杂,我们假设这个程序 foo不能在非unix环境下运行。

4

2 回答 2

5

似乎没有简单的方法。问题是配置文件是特殊的数据文件,它们应该得到特殊处理。

所以,编写我们自己的类:

class myinstall(distutils.command.install.install):
    if self.prefix == '/usr':
        self.conf_prefix = '/etc'
    else:
        self.conf_prefix = self.prefix + '/etc'

    install.finalize_options(self)

    def install_conf(self):
        self.mkpath((self.root or '') + self.conf_prefix)
        for file in self.distribution.conf_files:
        dest = (self.root or '') + self.conf_prefix + '/' +
            os.path.basename(file)
        self.copy_file(file, dest)

    # blah blah blah

然后:

setup(# blah blah blah
  conf_files = ['foo.cfg']
  cmdclass = {'install': myinstall,
      # blah blah blah
  }
)
于 2010-07-26T17:17:31.273 回答
5

子分类distutils.command.install.install不是绝对必要的。相反,data_files可以根据setup' Installing Additional Files' 的distutils文档传递给。

例如

setup(
    ...
    data_files = [
        (conf_path, ['foo.cfg'])
    ]
)

其中conf_path根据自己的要求计算。即通过测试sys.prefix(而不是self.prefix)来构建它,就像上面的@weakish 所做的那样。

于 2013-07-01T12:07:26.397 回答