Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在没有MANIFEST.in文件的情况下包含包_数据?_Python_Manifest_Packaging_Setuptools_Setup.py - Fatal编程技术网

Python 如何在没有MANIFEST.in文件的情况下包含包_数据?

Python 如何在没有MANIFEST.in文件的情况下包含包_数据?,python,manifest,packaging,setuptools,setup.py,Python,Manifest,Packaging,Setuptools,Setup.py,在没有MANIFEST.in文件的情况下,如何为sdist包含package\u数据 我的setup.py如下所示: import setuptools setuptools.setup( name='foo', version='2015.3', license='commercial', packages=setuptools.find_packages(), package_data={'': ['foo/bar.txt']}, ) 版本: u

在没有MANIFEST.in文件的情况下,如何为
sdist
包含
package\u数据

我的setup.py如下所示:

import setuptools

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

    package_data={'': ['foo/bar.txt']},
)
版本:

user@host> python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import setuptools
>>> setuptools.version.__version__
'3.6'
我就是不能把
foo/bar.txt
包括在内

还是仍然是真的

但在过去的一个小时里,我发现这些说法介于“危险的误导”和“该死的谎言”之间。 这是因为Python包的主要类型是源代码包,创建源代码包的规范方法是使用
setup.py sdist
。但是,包_数据中指定的数据不包括在源发行版中-它们仅包括在二进制(
setup.py bdist
)发行版和安装(
setup.py install
)中


在没有MANIFEST.in文件的情况下,如何为
sdist
包含
package\u数据?

TL;DR:包数据字典中的键是包;这些值是全局的列表<代码>'
不是任何Python包的有效名称

如果希望将
bar.txt
安装在软件包
foo
\uuuu init\uuuuuuuuuuuuuuuuupy
旁边,请使用

 package_data={'foo': ['bar.txt']}

我的布局如下:

foo/
        __init__.py
        bar.txt
setup.py
现在,如果
foo
是如上所述的包,请执行以下操作:

import setuptools

setuptools.setup(
    name='foo',
    version='2015.3',
    license='commercial',
    packages=setuptools.find_packages(),
    package_data={'foo': ['bar.txt']},
)
python setup.py sdist
之后,我检查了
dist/foo-2015.3.tar.gz

% tar tfz dist/foo-2015.3.tar.gz
...
foo-2015.3/foo/bar.txt
...
但是,如果我使用
package_data={'':['foo/bar.txt']}
运行您的
setup.py
,我可以同意
foo/bar.txt
不会添加到源代码分发中,除非
foo-2015.3.egg info/SOURCES.txt
已经有
foo/bar.txt
的行,否则该文件也会在源代码分发中弹出

没有使用舱单;setuptools的版本是
3.6
(我特意安装了与您使用的相同的旧版本):


上述行为也适用于“遗留”distutils文档的标准
distutils
;对2.7、3.1的注释:

在版本[2.7,3.1]中更改:如果未提供模板,则所有与
包_数据
匹配的文件将添加到
清单
文件中


我遇到了相同的问题,并已将其修复为删除:

include_package_data=True

谢谢你的详细回答。不幸的是,我只是一字不差地遵循这些说明,
bar.txt
未能出现在
foo-2015.3.tar.gz
中。您提到故意使用旧版本的setuptools,但没有说明原因。这能解释为什么它不起作用吗?这个答案并不完全正确。空字符串
'
是一个特殊的键,适用于所有包,如中所述:请注意,如果在空字符串下列出包_数据中的模式,则这些模式用于查找每个包中的文件,甚至那些也列出了自己的模式。这也为我解决了问题。有人能解释为什么吗?这里的顶部条目解释了这一点:@AdamErickson不,它没有?
include_package_data=True