<p><strong>TL;DR</strong>:字典中的键是<strong>包</strong>;值是全局列表。<code>''</code>不是任何Python包的有效名称。</p>
<p>如果要将<code>bar.txt</code>安装在包<code>foo</code>的<code>__init__.py</code>旁边,请使用</p>
<pre><code> package_data={'foo': ['bar.txt']}
</code></pre>
<hr/>
<p>我有布局:</p>
<pre><code>foo/
__init__.py
bar.txt
setup.py
</code></pre>
<p>现在,如果<code>foo</code>是像上面这样的包,请执行以下操作:</p>
<pre><code>import setuptools
setuptools.setup(
name='foo',
version='2015.3',
license='commercial',
packages=setuptools.find_packages(),
package_data={'foo': ['bar.txt']},
)
</code></pre>
<p>在<code>python setup.py sdist</code>之后,我检查<code>dist/foo-2015.3.tar.gz</code>的内容</p>
<pre><code>% tar tfz dist/foo-2015.3.tar.gz
...
foo-2015.3/foo/bar.txt
...
</code></pre>
<p>但是,如果我用<code>package_data={'': ['foo/bar.txt']}</code>运行您的<code>setup.py</code>,我可以同意<code>foo/bar.txt</code>将不会添加到源发行版,<em>中,除非<code>foo-2015.3.egg-info/SOURCES.txt</code>已经有<code>foo/bar.txt</code>的行-在这种情况下,文件也将在源发行版中弹出</em></p>
<p>没有使用清单;setuptools版本是<code>3.6</code>(我故意安装了与您使用的相同的旧版本):</p>
<pre><code>>>> import setuptools
>>> setuptools.__version__
'3.6'
</code></pre>
<hr/>
<p>上述行为也适用于“遗留”distutils文档的标准<code>distutils</code>:<a href="https://docs.python.org/3/distutils/setupscript.html#installing-package-data" rel="noreferrer">2.6 Installing package data</a>;注释为2.7、3.1:</p>
<blockquote>
<p>Changed in version <em>[2.7, 3.1]</em>: All the files that match <code>package_data</code> will be added to the <code>MANIFEST</code> file <em>if no template is provided</em>.</p>
</blockquote>