setup.py没有安装数据文件

Pau*_*han 18 python distutils python-2.7

我有一个Python库,除常规Python模块外,还有一些数据文件需要放在/usr/local/lib/python2.7/dist-package/mylibrary中.

不幸的是,我无法说服setup.py在那里实际安装数据文件.请注意,此行为是在安装 - 而不是sdist.

这是setup.py的略微编辑版本

module_list = list_of_files

setup(name         ='Modules',
      version      ='1.33.7',
      description  ='My Sweet Module',
      author       ='PN',
      author_email ='email',
      url          ='url',
      packages     = ['my_module'],

# I tried this. It got installed in /usr/my_module. Not ok.

      # data_files   = [ ("my_module",  ["my_module/data1",
      #                                  "my_module/data2"])]

# This doesn't install it at all.
      package_data = {"my_module" : ["my_module/data1",
                                     "my_module/data2"] }
     )
Run Code Online (Sandbox Code Playgroud)

这是在Python 2.7中(最终必须在2.6中运行),并且必须在10.04和12+之间的某些Ubuntu上运行.现在正在12.04开发它.

pod*_*mok 17

UPD: package_data接受格式的dict {'package': ['list', 'of?', 'globs*']},所以要使它工作,应该指定相对于包dir的shell globs,而不是相对于分发根的文件路径.

data_files 具有不同的含义,并且通常应避免使用此参数.

使用setuptools只需要include_package_data=True,但数据文件应该在版本控制系统下,setuptools已知(默认情况下它只能识别CVS和SVN,安装setuptools-git或者setuptools-hg如果你使用git或hg ......)


使用setuptools,您可以:

- 在MANIFEST.im中:

    include my_module/data*
Run Code Online (Sandbox Code Playgroud)

- 在setup.py中:

    setup(
        ...
        include_package_data = True,
        ...
    )
Run Code Online (Sandbox Code Playgroud)

  • include_package_data = True,通常对我不起作用。 (3认同)

mon*_*kut 6

http://docs.python.org/distutils/setupscript.html#installing-additional-files

如果directory是相对路径,则相对于安装前缀(Python的纯Python包的sys.prefix,包含扩展模块的包的sys.exec_prefix)进行解释.

这可能会这样做:

data_files   = [ ("my_module",  ["local/lib/python2.7/dist-package/my_module/data1",\n                                 "local/lib/python2.7/dist-package/my_module/data2"])]\n
Run Code Online (Sandbox Code Playgroud)

或者只是使用join来添加前缀:

data_dir = os.path.join(sys.prefix, "local/lib/python2.7/dist-package/my_module")\ndata_files   = [ ("my_module",  [os.path.join(data_dir, "data1"),\n                                 os.path.join(data_dir, "data2")])]\n
Run Code Online (Sandbox Code Playgroud)

  • 这不是正确的方法.`data_files`适用于要放在/ usr下的文件(例如图标,.desktop文件等).如果要将数据与Python模块一起包含,请使用`package_data`和`include_package_data = True`标志. (6认同)
  • 我使用了distutils.sysconfig.get_python_lib()+"path"并将其用作密钥. (4认同)
  • 嗯。不愿意对路径进行硬编码,但这可能暂时有用。 (2认同)