如何使用setuptools / distribute包含包数据?

当使用setuptools / distribute时,我无法让安装程序拉入任何package_data文件。 我读过的所有内容都说明以下是正确的方法。 有人可以请指教?

 setup( name='myapp', packages=find_packages(), package_data={ 'myapp': ['data/*.txt'], }, include_package_data=True, zip_safe=False, install_requires=['distribute'], ) 

myapp/data/是数据文件的位置。

我意识到这是一个古老的问题…但是,人们通过Google在这里find方法: package_data是一个低调的, 肮脏的谎言 。 它只在构build二进制包( python setup.py bdist ... )时使用, 在构build源代码包( python setup.py sdist ... )时不能使用。 这当然是荒谬的 – 人们会期望构build源代码分发将导致可以发送给其他人构build二进制分发的文件的集合。

在任何情况下,使用MANIFEST.in可以用于二进制和源代码分发。

我刚刚有同样的问题。 解决scheme,只是简单地删除include_package_data=True

在这里阅读之后,我意识到include_package_data旨在包含来自版本控制的文件,而不是像名称所暗示的那样仅包含“包数据”。 从文档:

[include_package_data]的数据文件必须在CVS或Subversion控制下

如果您希望对包含的文件进行更细致的控制(例如,如果您的软件包目录中有文档文件,并希望将其从安装中排除),那么您也可以使用package_data关键字。

把这个论点固定下来,巧合的是,为什么它在你转变为distutils时也起作用,因为它没有采取这个论点。

继@Joe的build议,删除include_package_data=True行也为我工作。

再详细一点,我没有 MANIFEST.in文件。 我使用Git而不是CVS。

仓库采取这种forms:

 /myrepo - .git/ - setup.py - myproject - __init__.py - some_mod - __init__.py - animals.py - rocks.py - config - __init__.py - settings.py - other_settings.special - cool.huh - other_settings.xml - words - __init__.py word_set.txt 

setup.py

 from setuptools import setup, find_packages import os.path setup ( name='myproject', version = "4.19", packages = find_packages(), # package_dir={'mypkg': 'src/mypkg'}, # didnt use this. package_data = { # If any package contains *.txt or *.rst files, include them: '': ['*.txt', '*.xml', '*.special', '*.huh'], }, # # Oddly enough, include_package_data=True prevented package_data from working. # include_package_data=True, # Commented out. data_files=[ # ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']), ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]), # ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]), ('/opt/local/myproject/data', [os.path.join('myproject/words', 'word_set.txt')]), ], install_requires=[ 'jsonschema', 'logging', ], entry_points = { 'console_scripts': [ # Blah... ], }, ) 

我运行python setup.py sdist源代码分配(还没有尝试二进制)。

而当在一个全新的虚拟环境中,我有一个myproject-4.19.tar.gz文件,我使用

 (venv) pip install ~/myproject-4.19.tar.gz ... 

除了所有安装到我的虚拟环境的site-packages ,这些特殊的数据文件被安装到/opt/local/myproject/data/opt/local/myproject/etc

include_package_data=True为我工作。

如果你使用git,记得在install_requires包含setuptools-git 。 远比没有Manifest或在package_data包含所有path(在我的情况下,它是一个包含各种静态的django应用程序)

(粘贴我的评论,因为k3-rnc提到它实际上是有帮助的)

我通过切换distutils解决了这个问题。 看起来分布已被弃用和/或破坏。

 from distutils.core import setup setup( name='myapp', packages=['myapp'], package_data={ 'myapp': ['data/*.txt'], }, ) 

将包含包数据的文件夹移动到模块文件夹解决了我的问题。

看到这个问题: MANIFEST.in忽略“python setup.py install” – 没有安装数据文件?

古代的问题,然而…python的包pipe理确实留下了许多不尽人意的地方。 所以我有用pip在本地安装到指定目录的用例,并且感到惊讶的是package_data和data_filespath都没有工作。 我并不热衷于在repo中添加另一个文件,所以我最终利用了data_files和setup.py选项–install-data; 像这样的东西

 pip install . --install-option="--install-data=$PWD/package" -t package