Python setuptools:如何包含配置文件以分发到<prefix>/etc

Vic*_*lex 34 python setuptools

我怎么写setup.py这样:

  1. 二元蛋分发(bdist_egg)包括一个示例配置文件和
  2. 安装后将其放入{prefix}/etc目录?

示例项目源目录如下所示:

bin/
   myapp
etc/
   myapp.cfg
myapp/
    __init__.py
    [...]
setup.py
Run Code Online (Sandbox Code Playgroud)

setup.py看起来像这样:

from distutils.command.install_data import install_data

packages = ['myapp', ]
scripts = ['bin/myapp',]
cmdclasses = {'install_data': install_data}
data_files = [('etc', ['etc/myapp.cfg'])]

setup_args = {
    'name': 'MyApp',
    'version': '0.1',
    'packages': packages,
    'cmdclass': cmdclasses,
    'data_files': data_files,
    'scripts': scripts,
#    'include_package_data': True,
    'test_suite': 'nose.collector'
}

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

setup(**setup_args)
Run Code Online (Sandbox Code Playgroud)

setuptools安装在构建环境和安装环境中.

'include_package_data'注释掉与否没有帮助.

Akh*_*rus 17

我正在研究这个问题,我认为答案在setuptools文档中:http://peak.telecommunity.com/DevCenter/setuptools#non-package-data-files

接下来,我引用我认为有答案的摘录:

非包数据文件

distutils通常将一般"数据文件"安装到特定于平台的位置(例如/ usr/share).此功能旨在用于文档,示例配置文件等.但是,setuptools不会将这些数据文件安装在单独的位置.它们捆绑在egg文件或目录中,与Python模块和包一起.也可以使用资源管理API [...]访问数据文件

顺便提一下,请注意,这种数据文件封装意味着您无法将数据文件实际安装到用户计算机上的任意位置 ; 这是一个功能,而不是一个bug.您始终可以在分发中包含一个脚本,该脚本可以自行决定将文档或数据文件提取并复制到用户指定的位置.如果将相关数据文件放在单个目录中,则可以使用带有目录名称的resource_filename()来获取文件系统目录,然后可以使用shutil模块进行复制.[...]

  • @Flimm我们经常将安全措施造成的不便视为错误.我们也认为缺乏安全性是一个错误.那就是说...正如您从https://docs.python.org/2/distutils/setupscript.html#installing-additional-files中看到的那样,功能/错误已被消除.恭喜,您现在可以在他们pip安装您的json库时替换受害者'/ bin/bash'.;-) (10认同)
  • 为什么它是一个功能,而不是一个错误? (5认同)
  • 我的意思是,他们为什么打算以这种方式工作?在我看来,人们希望能够将数据文件安装到用户机器上的任意位置. (4认同)
  • @Flimm,这是一个功能,因为它打算像这样工作.API专门用于呈现此类行为.甚至记录并妥善解释.[bug](http://en.wikipedia.org/wiki/Software_bug)是计算机程序或系统中的错误,缺陷,错误,失败或错误,产生错误或意外结果,或导致其表现以无意的方式. (2认同)