29

我有一个 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 开发它。

4

3 回答 3

24

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

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

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


使用 setuptools,您可以:

- 在 MANIFEST.im 中:

    include my_module/data*

- 在 setup.py 中:

    setup(
        ...
        include_package_data = True,
        ...
    )
于 2013-05-15T23:53:37.173 回答
5

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

如果 directory 是一个相对路径,它被解释为相对于安装前缀(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")])]
于 2012-06-27T23:27:28.103 回答
0

以下解决方案对我来说很好。您应该有 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在安装文件中也有

于 2020-01-12T20:15:44.080 回答