cmc*_*nty 115 python 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'],
)
Run Code Online (Sandbox Code Playgroud)
myapp/data/数据文件的位置在哪里.
lar*_*sks 249
我意识到这是一个老问题......但对于那些通过谷歌找到方法的人来说:这 package_data是一个低沉,肮脏的谎言.它构建时才使用二进制包(python setup.py bdist ...),但不建立源代码包时(python setup.py sdist ...).当然,这是荒谬的 - 人们会期望构建源代码分发会导致可以发送给其他人构建二进制分发的文件集合.
在任何情况下,using MANIFEST.in都可以用于二进制和源代码分发.
Joe*_*Joe 29
我刚才有同样的问题.解决方案,只是删除include_package_data=True.
在这里阅读之后,我意识到include_package_data目的是包含来自版本控制的文件,而不是仅仅像名称所暗示的那样"包括数据包".来自文档:
[include_package_data]数据文件必须在CVS或Subversion控件下
...
如果您希望对包含的文件进行更精细的控制(例如,如果您的包目录中有文档文件并希望将它们从安装中排除),那么您也可以使用该
package_data关键字.
把这个论点修正了,这恰巧是为什么当你切换到distutils时它也起作用,因为它没有采取这个论点.
Hey*_*his 19
以下@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
Run Code Online (Sandbox Code Playgroud)
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...
], },
)
Run Code Online (Sandbox Code Playgroud)
我python setup.py sdist为源发行版运行(没有尝试二进制).
当在一个全新的虚拟环境中,我有一个myproject-4.19.tar.gz文件,我使用
(venv) pip install ~/myproject-4.19.tar.gz
...
Run Code Online (Sandbox Code Playgroud)
除了安装到我的虚拟环境的所有内容之外site-packages,这些特殊数据文件安装到/opt/local/myproject/data和/opt/local/myproject/etc.
从 setuptools 30.3.0(2016-12-08 发布)开始,您可以保持setup.py非常小的配置并将配置移动到setup.cfg文件中。通过这种方法,您可以将包数据放在一个[options.package_data]部分中:
[options.package_data]\n* = *.txt, *.rst\nhello = *.msg\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,您的setup.py长度可以短至:
[options.package_data]\n* = *.txt, *.rst\nhello = *.msg\nRun Code Online (Sandbox Code Playgroud)\n\n有关详细信息,请参阅使用 setup.cfg 文件配置安装程序。
\n\n有人讨论要setup.cfg弃用PEP 518pyproject.toml中的提议,但这截至 2020 年 2 月 21 日仍然是临时的。
更新:此答案是旧的,该信息不再有效。所有setup.py配置均应使用import setuptools。我在/sf/answers/3465094531/中添加了更完整的答案
我通过切换到distutils解决了这个问题。似乎已弃用和/或破坏了分发。
from distutils.core import setup
setup(
name='myapp',
packages=['myapp'],
package_data={
'myapp': ['data/*.txt'],
},
)
Run Code Online (Sandbox Code Playgroud)
小智 7
我在遇到同样的问题时发现了这篇文章。
\n我的经验与其他答案中的经验相矛盾。\ninclude_package_data=True 确实包含\nbdist中的数据!setuptools\n文档中的解释\n缺乏上下文和疑难解答提示,但是\ninclude_package_data按宣传的那样工作。
我的设置:
\nsetuptoolsv47.3.1check-manifestv0.42这是我的操作指南。
\n以下是我在 PyPI 上发布的项目的文件结构。\n(它将应用程序安装在 中__main__.py)。
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LICENSE.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 MANIFEST.in\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_package\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __main__.py\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 _my_data <---- folder with data\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 consola.ttf <---- data file\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 icon.png <---- data file\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\nRun Code Online (Sandbox Code Playgroud)\nsetuptools.setup()这是in\n的通用起点setup.py。
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LICENSE.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 MANIFEST.in\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_package\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __main__.py\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 _my_data <---- folder with data\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 consola.ttf <---- data file\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 icon.png <---- data file\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\nRun Code Online (Sandbox Code Playgroud)\nsetuptools.find_packages()包括我在发行版中的所有软件包。我唯一的包裹是my_package.
包含我的数据的子文件夹_my_data, 不被 Python 视为\n包,因为它不包含__init__.py,\n因此find_packages()找不到它。
经常引用但不正确的解决方案是在文件夹中放置一个空__init__.py文件_my_data。
这确实使其成为一个包,因此它确实_my_data在发行版中包含该文件夹。但里面的数据文件_my_data不包括在内。
所以做成_my_data一个包并没有什么帮助。
解决办法是:
\nsdist包含数据文件include_package_data=True以将数据文件bdist也包含在使其成为可重复的实验需要三个步骤:
\nsetuptools.setup(\n ...\n packages=setuptools.find_packages(),\n ...\n)\nRun Code Online (Sandbox Code Playgroud)\n我将逐步分解这些:
\n$ rm -fr build/ dist/ my_package.egg-info/\n$ check-manifest\n$ python setup.py sdist bdist_wheel\nRun Code Online (Sandbox Code Playgroud)\ncheck-manifest以确保MANIFEST.in 匹配\n版本控制下文件的 Git 索引:$ rm -fr build/ dist/ my_package.egg-info/\nRun Code Online (Sandbox Code Playgroud)\n如果MANIFEST.in尚不存在,请从版本控制下文件的 Git\n索引创建它:
$ check-manifest\nRun Code Online (Sandbox Code Playgroud)\n这是MANIFEST.in创建的:
include *.md\nrecursive-include my_package *.png\nrecursive-include my_package *.ttf\nRun Code Online (Sandbox Code Playgroud)\n没有理由手动编辑此文件。
\n只要所有应该在版本控制之下的东西都在版本控制之下(即,是Git 索引的一部分check-manifest --create),\n就会做正确的事情。
注意:文件不是Git 索引的一部分:
\n.gitignore.git/info/exclude如果有任何文件受版本控制\n但不应该受版本控制,check-manifest则会发出警告并\n指定建议从 Git 索引中删除哪些文件。
$ check-manifest --create\nRun Code Online (Sandbox Code Playgroud)\n现在检查sdist(源分布)和bdist_wheel\n(构建发行版)以查看它们是否包含数据文件。
看看里面的内容sdist(下面仅显示相关行):
$ tar --list -f dist/my_package-0.0.1a6.tar.gz\nmy_package-0.0.1a6/\n...\nmy_package-0.0.1a6/my_package/__init__.py\nmy_package-0.0.1a6/my_package/__main__.py\nmy_package-0.0.1a6/my_package/_my_data/\nmy_package-0.0.1a6/my_package/_my_data/consola.ttf <-- yay!\nmy_package-0.0.1a6/my_package/_my_data/icon.png <-- yay!\n...\nRun Code Online (Sandbox Code Playgroud)\n因此sdist已经包含了数据文件,因为它们\n列在MANIFEST.in. 无需执行任何额外操作即可将\n数据文件包含在sdist.
查看内容bdist(它是一个 .zip 文件,用 解析\n zipfile.ZipFile):
include *.md\nrecursive-include my_package *.png\nrecursive-include my_package *.ttf\nRun Code Online (Sandbox Code Playgroud)\n注意:您需要创建自己的check-whl.py脚本来生成\n上面的输出。它只有三行:
$ python setup.py sdist bdist_wheel\nRun Code Online (Sandbox Code Playgroud)\n正如预期的那样,bdist缺少数据文件。
该_my_data文件夹完全丢失。
如果我创建一个怎么办_my_data/__init__.py?我重复实验,发现数据文件仍然不存在!包含\n_my_data/文件夹,但不包含\n数据文件!
与其他人的经验相反,这确实有效:
\n$ tar --list -f dist/my_package-0.0.1a6.tar.gz\nmy_package-0.0.1a6/\n...\nmy_package-0.0.1a6/my_package/__init__.py\nmy_package-0.0.1a6/my_package/__main__.py\nmy_package-0.0.1a6/my_package/_my_data/\nmy_package-0.0.1a6/my_package/_my_data/consola.ttf <-- yay!\nmy_package-0.0.1a6/my_package/_my_data/icon.png <-- yay!\n...\nRun Code Online (Sandbox Code Playgroud)\n修复到位后,重做实验:
\n$ python check-whl.py\nmy_package/__init__.py\nmy_package/__main__.py\nmy_package-0.0.1a6.dist-info/LICENSE.md\nmy_package-0.0.1a6.dist-info/METADATA\nmy_package-0.0.1a6.dist-info/WHEEL\nmy_package-0.0.1a6.dist-info/entry_points.txt\nmy_package-0.0.1a6.dist-info/top_level.txt\nmy_package-0.0.1a6.dist-info/RECORD\nRun Code Online (Sandbox Code Playgroud)\n确保sdist仍然有数据文件:
from zipfile import ZipFile\npath = "dist/my_package-0.0.1a6-py3-none-any.whl" # <-- CHANGE\nprint(\'\\n\'.join(ZipFile(path).namelist()))\nRun Code Online (Sandbox Code Playgroud)\n看看下面的内容bdist:
setuptools.setup(\n ...\n packages=setuptools.find_packages(),\n include_package_data=True, # <-- adds data files to bdist\n ...\n)\nRun Code Online (Sandbox Code Playgroud)\n我建议使用上面概述的方法进行故障排除/测试来检查sdist和bdist.
注意:pip install -e . 不显示数据文件是否包含在bdist.
符号链接导致安装的行为就像包含数据文件一样(因为它们已经存在于开发人员的计算机本地)。
\n之后pip install my_package,数据文件位于虚拟环境的lib/site-packages/my_package/文件夹中,\n使用与上面内容列表中显示的\n完全相同的文件结构whl。
发布到 TestPyPI 然后安装并查看lib/site-packages/my_packages是一个有效的测试,但太耗时。
几天来我遇到了同样的问题,但即使是这个线程也无法帮助我,因为一切都令人困惑。所以我做了我的研究并找到了以下解决方案:
基本上在这种情况下,你应该这样做:
Run Code Online (Sandbox Code Playgroud)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'], }, )
| 归档时间: |
|
| 查看次数: |
66057 次 |
| 最近记录: |