如何在没有MANIFEST.in文件的情况下包含package_data?

gue*_*tli 24 python packaging manifest setuptools setup.py

我怎么能包括package_datasdist没有MANIFEST.in文件?

我的setup.py看起来像这样:

import setuptools

setuptools.setup(
    name='foo',
    version='2015.3',
    license='commercial',
    packages=setuptools.find_packages(),

    package_data={'': ['foo/bar.txt']},
)
Run Code Online (Sandbox Code Playgroud)

版本:

user@host> python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import setuptools
>>> setuptools.version.__version__
'3.6'
Run Code Online (Sandbox Code Playgroud)

我只是不能被foo/bar.txt包括在内.

或者这篇博文仍然是真的吗? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging-documentation-on--package_data-/

然而,在过去的一小时里,我了解到这些陈述介于"危险的误导"和"该死的谎言"之间.这是因为Python包的主要类型是源包,而创建源包的规范方法是使用setup.py sdist.但是,package_data中指定的数据不包含在源代码分发中 - 它们仅包含在binary(setup.py bdist)发行版和installs(setup.py install)中.

我怎么能包括package_datasdist没有MANIFEST.in文件?

Ant*_*ala 42

TL; DR:package_data词典中的键是 ; 值是globs列表.''不是任何Python包的有效名称.

如果您希望bar.txt安装在__init__.py软件包旁边foo,请使用

 package_data={'foo': ['bar.txt']}
Run Code Online (Sandbox Code Playgroud)

我有布局:

foo/
        __init__.py
        bar.txt
setup.py
Run Code Online (Sandbox Code Playgroud)

现在,如果foo是上面的包,请执行:

import setuptools

setuptools.setup(
    name='foo',
    version='2015.3',
    license='commercial',
    packages=setuptools.find_packages(),
    package_data={'foo': ['bar.txt']},
)
Run Code Online (Sandbox Code Playgroud)

之后python setup.py sdist,我查看了内容dist/foo-2015.3.tar.gz

% tar tfz dist/foo-2015.3.tar.gz
...
foo-2015.3/foo/bar.txt
...
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行你setup.pypackage_data={'': ['foo/bar.txt']},我可以同意foo/bar.txt不会添加到源分发,除非foo-2015.3.egg-info/SOURCES.txt已经有行foo/bar.txt- 在这种情况下,该文件也将在源代码分发中弹出

没有使用清单; setuptools版本是3.6(我故意安装了你正在使用的旧版本):

>>> import setuptools
>>> setuptools.__version__
'3.6'
Run Code Online (Sandbox Code Playgroud)

上述行为也适用于标准distutils:2.6安装 "legacy"distutils文档的包数据 ; 评论为2.7,3.1:

版本[2.7,3.1]中已更改:如果未提供模板,则所有匹配的文件package_data都将添加到MANIFEST文件中.

  • 感谢您的详细回答。不幸的是,我只是逐字地遵循了这些说明,而bar.txt却没有出现在foo-2015.3.tar.gz中。您故意提到使用旧版本的setuptools,但没有说为什么。可以解释为什么它不起作用吗? (2认同)
  • 这个答案并不完全正确。空字符串`''是一个特殊键,适用于[here](https://setuptools.readthedocs.io/en/latest/setuptools.html#include-data-files)中所述的所有软件包:您在空字符串下的package_data中列出了模式,这些模式用于查找每个程序包中的文件,即使也列出了自己的模式。 (2认同)

小智 13

我有同样的问题,并修复它删除:

include_package_data=True
Run Code Online (Sandbox Code Playgroud)

  • 有人可以解释一下原因吗? (8认同)
  • @AdamErickson 不,不是吗? (3认同)