【问题标题】:setup.py not installing data filessetup.py 未安装数据文件
【发布时间】:2012-06-27 22:44:45
【问题描述】:

我有一个 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"] }
     )

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

【问题讨论】:

标签: python python-2.7 distutils


【解决方案1】:

UPDpackage_data 接受格式为 {'package': ['list', 'of?', 'globs*']} 的 dict,因此要使其正常工作,应指定相对于包目录的 shell glob,而不是相对于分发根目录的文件路径。

data_files 有不同的含义,一般来说应该避免使用这个参数。

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


使用 setuptools,您可以:

- 在 MANIFEST.im:

    include my_module/data*

- 在 setup.py 中:

    setup(
        ...
        include_package_data = True,
        ...
    )

【讨论】:

  • 嗯。这有点短。您能否详细说明各自的行为导致了什么?我必须同时做两件事还是其中任何一个?
  • 这是独立于平台工作的方法。当我使用公认的答案时,它可以在 Mac OS 上运行,但在 Linux VM 上,数据文件被复制到了陌生的地方。
  • 当我在 MAINFEST 中包含 include my_module/data* 并在 setup.py 中定义了 data_files 时,安装不会复制数据文件。删除 setup.py 中的 data_files 定义而将包含保留在 MANIFEST 中会导致预期的行为。
  • include_package_data = True,通常对我不起作用。
  • -1:您实际上确实需要使用data_files 参数,尤其是从远程安装时,例如pip3 install git+https://somesite.com/path/to/repo.git。否则,数据文件无法作为安装的一部分包含在内,您的程序将中断(就像我的那样)。因此,您的 setup 函数中需要 both data_filesinclude_package_data
【解决方案2】:

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

如果目录是一个相对路径,它被解释为相对于 安装前缀(Python 的 sys.prefix 用于纯 Python 包, sys.exec_prefix 用于包含扩展模块的包)。

这可能会做到:

data_files   = [ ("my_module",  ["local/lib/python2.7/dist-package/my_module/data1",
                                 "local/lib/python2.7/dist-package/my_module/data2"])]

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

data_dir = os.path.join(sys.prefix, "local/lib/python2.7/dist-package/my_module")
data_files   = [ ("my_module",  [os.path.join(data_dir, "data1"),
                                 os.path.join(data_dir, "data2")])]

【讨论】:

  • 嗯。不愿对路径进行硬编码,但这可能暂时有用。
  • 我使用了 distutils.sysconfig.get_python_lib() + "path" 并将其用作键。
  • 这不是正确的做法。 data_files 用于您要放在 /usr 下的文件(例如图标、.desktop 文件等)。如果您想在 Python 模块中包含数据,请使用 package_datainclude_package_data=True 标志。
  • 我认为 python2.7 的 distutils 中不存在 sysconfig 属性,include_package_data=True 也不起作用
  • 各种网页声称data_files 将安装的内容定位在sys.prefixsys.exec_prefixsite.USER_BASE 下的某处。我试过了,它把它们放在/usr 下,这些都不是。
【解决方案3】:

以下解决方案对我来说效果很好。 您应该有 setup.py 所在的 MANIFEST.in 文件。

将以下代码添加到清单文件中

recursive-include mypackage *.json *.md # can be extended with more extensions or file names. 

另一种解决方案是将以下代码添加到 MANIFEST.in 文件中。

graft mypackage # will copy the entire package including non-python files. 
global-exclude __pyache__ *.txt # list files you dont want to include here. 

现在,当您执行 pip install 时,所有必要的文件都将包含在内。

希望这会有所帮助。

更新: 确保您在设置文件中也有 include_package_data=True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2016-05-10
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多