问题:如何在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/
数据文件的位置在哪里。
回答 0
我知道这是一个老问题,但人们发现这里通过谷歌自己的方式: package_data
是低了下来,肮脏的谎言。它仅在构建二进制软件包(python setup.py bdist ...
)时使用,而在构建源软件包(python setup.py sdist ...
)时不使用。当然,这是荒谬的-人们希望构建源代码分发将导致文件集合,这些文件可以发送给其他人来构建二进制分发。
在任何情况下,使用MANIFEST.in
将工作既二进制和源分布。
回答 1
我只是有同样的问题。解决的方法是简单地删除include_package_data=True
。
在这里阅读之后,我意识到它include_package_data
旨在包含来自版本控制的文件,而不是顾名思义仅包含“ include package data”。从文档:
[include_package_data]的数据文件必须处于CVS或Subversion控制之下
…
如果要对包含的文件进行更细粒度的控制(例如,如果您的软件包目录中有文档文件,并希望将其从安装中排除),则也可以使用
package_data
关键字。
把那个参数排除掉可以解决这个问题,这恰好是为什么当您切换到distutils时它也可以工作的原因,因为它不接受那个参数。
回答 2
遵循@Joe的建议删除该include_package_data=True
行也对我有用。
详细说明一下,我没有 MANIFEST.in
文件。我使用Git而不是CVS。
存储库采用以下形式:
/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
。
回答 3
include_package_data=True
为我工作。
如果你使用git,请记住,包括setuptools-git
在install_requires
。远没有拥有Manifest
或包含所有路径package_data
(在我的情况下,它是具有各种静态特性的django应用程序)那么无聊
(粘贴了我的评论,就像k3-rnc所说的那样,实际上是有帮助的)
回答 4
更新:此答案是旧的,该信息不再有效。所有setup.py配置均应使用import setuptools
。我在https://stackoverflow.com/a/49501350/64313中添加了更完整的答案
我通过切换到distutils解决了这个问题。似乎已弃用和/或破坏了分发。
from distutils.core import setup
setup(
name='myapp',
packages=['myapp'],
package_data={
'myapp': ['data/*.txt'],
},
)
回答 5
古老的问题,然而… python的软件包管理确实有很多不足之处。因此,我有在本地使用pip安装到指定目录的用例,很惊讶package_data和data_files路径都无法解决。我不希望再向仓库添加另一个文件,所以最终我利用了data_files和setup.py选项–install-data;。像这样的东西
pip install . --install-option="--install-data=$PWD/package" -t package
回答 6
将包含软件包数据的文件夹移到module文件夹为我解决了这个问题。
回答 7
我在几天中遇到了同样的问题,但是即使一切都变得混乱,这个线程也无法为我提供帮助。因此,我进行了研究,发现了以下解决方案:
基本上在这种情况下,您应该执行以下操作:
from setuptools import setup setup( name='myapp', packages=['myapp'], package_dir={'myapp':'myapp'}, # the one line where all the magic happens package_data={ 'myapp': ['data/*.txt'], }, )
回答 8
只需删除该行:
include_package_data=True,
从您的安装脚本中,它将正常工作。(刚刚通过最新的setuptools测试。)
回答 9
使用setup.cfg(setuptools≥30.3.0)
从setuptools 30.3.0(2016年12月8日发布)开始,您可以保持setup.py
很小的规模并将配置移动到setup.cfg
文件中。使用这种方法,您可以将包数据放在以下[options.package_data]
部分中:
[options.package_data]
* = *.txt, *.rst
hello = *.msg
在这种情况下,您setup.py
可以做到:
from setuptools import setup
setup()
有关更多信息,请参阅使用setup.cfg文件配置安装程序。
有一些关于setup.cfg
PEP 518中pyproject.toml
提议的弃用赞成的说法,但从2020年2月21日起这仍然是临时的。