【问题标题】:Including data files with setup.py使用 setup.py 包含数据文件
【发布时间】:2017-12-22 04:52:57
【问题描述】:

我在 setup.py 脚本中包含数据文件时遇到了问题。我的包设置如下:

my_package/
    setup.py
    MANIFEST.in

    my_package/
        __init__.py
        access_data.py

        data_files/
            my_data_file.csv

我想在安装时包含my_data_file.csv 文件,以便access_data.py 可以读取它。为此,我在setuptools 中使用了package_data 关键字:

setup(...,
      packages=['my_package'],
      package_data={'my_package': ['./my_package/data_files/my_data_file.csv']},
      include_package_data=True
      )

我还将文件包含在MANIFEST.in

recursive-include my_package/data_files *

setup.py 似乎运行良好并且没有抛出任何错误。但是,当我导入包时,由于缺少my_data_file.csv,我得到了一个找不到文件的错误。我曾尝试参考其他堆栈溢出问题(尤其是this one),但无法弄清楚我做错了什么。如何让 setup.py 包含必要的数据文件?

【问题讨论】:

  • 您使用的是不区分大小写的文件系统吗? manifest.in 真的应该是 MANIFEST.in。但这并不重要,因为 MANIFEST.in 用于源代码分发 (sdist)。
  • 调试时首先想到的是将大问题拆分成许多小问题。让我们一步一步来。第 1 步:检查您的发行版(sdist、egg 或 wheel)是否确实包含 my_data_file.csv;如果没有,请修复 setup.py 以包含它。第 2 步:检查是否安装了 my_data_file.csv。第 3 步 - 调试为什么即使文件就位也无法访问文件(文件路径错误?权限?)
  • 你的行应该是package_data={'my_package': ['data_files/my_data_file.csv']},(在my_package包下,没有my_package目录)

标签: python setuptools packaging setup.py


【解决方案1】:

如果它在setup.pypackage_data 中列出(正确),则不需要将其包含在MANIFEST.in 中(因为它会自动包含在内)

在您的情况下,错误在于您的 package_data 行,路径是相对于命名空间的根目录

在你的情况下应该是:

package_data={'my_package': ['data_files/my_data_file.csv']},

另请注意,包数据中的键是带点的模块路径(不过,它与这个玩具箱无关)。

【讨论】:

  • 对于那些不知道点名到底是什么的人:Packages are a way of structuring Python’s module namespace by using “dotted module names”. For example, the module name A.B designates a submodule named B in a package named A. (source link)
  • 如何将所有内容都包含在一个文件夹中?
  • @JohnAndrews 它支持 glob,所以使用 * -- for example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2017-05-28
相关资源
最近更新 更多