如何使用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