2015-03-13 110 views
12

如何在沒有MANIFEST.in文件的情況下包含package_data for sdist如何在不包含MANIFEST.in文件的情況下包含package_data?

我setup.py看起來是這樣的:

import setuptools 

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

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

版本:

[email protected]> python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import setuptools 
>>> setuptools.version.__version__ 
'3.6' 

我只是無法得到包括foo/bar.txt

或者是this blog post仍然如此? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging-documentation-on--package_data-/

不過,在過去的一個小時內,我知道這些陳述介於「危險的誤導」和「該死的謊言」之間。 這是因爲Python包的主要類型是源包,創建源包的規範方法是使用setup.py sdist。但是,package_data中指定的數據不包含在源代碼發行版中 - 它們僅包含在二進制文件(setup.py bdist)分發和安裝(setup.py install)中。

如何在沒有MANIFEST.in文件的情況下包含package_datasdist

回答

23

TL; DRpackage_data字典中的鍵是;這些值是球體列表。 ''不是任何Python包的有效名稱。

如果你想有bar.txt被旁邊的包foo__init__.py安裝,使用

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 
... 

內容但是,如果我運行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' 

上面還行爲標準distutils作品:「遺產」的distutils文件2.6 Installing package data;與2.7,3.1評論:

改變在版[2.7,3.1]:所有符合package_data將被添加到MANIFEST文件如果沒有模板提供的文件。

+1

感謝詳細的解答。不幸的是,我只是按照這些指令逐字逐句,'bar.txt'未能出現在'foo-2015.3.tar.gz'中。你提到故意使用舊版本的setuptools,但你不明白爲什麼。這能解釋爲什麼它不起作用嗎? – 2015-08-05 03:31:45

5

我有同樣的問題,並修復它被移除:

include_package_data=True 
相關問題