jwh*_*ock 52 python pip python-wheel
如何控制车轮中包含哪些文件?它似乎MANIFEST.in没有被使用python setup.py bdist_wheel.
更新:
从源tarball到wheel安装之间的区别我错了.源代码分发包括指定的文件MANIFEST.in,但安装的软件包只有python文件.需要步骤来识别应安装的其他文件,无论安装是通过源分发,egg还是wheel.也就是说,其他包文件需要package_data,而命令行脚本或系统配置文件需要包外的文件的data_files.
我有一个项目,我一直python setup.py sdist用来构建我的包,MANIFEST.in控制包含和排除的文件,以及pyroma和check-manifest来确认我的设置.
我最近将它转换为双Python 2/3代码,并添加了一个setup.cfg
[bdist_wheel]
universal = 1
Run Code Online (Sandbox Code Playgroud)
我可以用python setup.py bdist_wheel它来制造一个轮子,它看起来像是一个万向轮.但是,它不包括指定的所有文件MANIFEST.in.
我挖得更深,现在更了解包装和轮子.这是我学到的东西:
我将两个包文件上传到PyPi上的multigtfs项目:
multigtfs-0.4.2.tar.gz- 源tar球,包括所有文件MANIFEST.in.multigtfs-0.4.2-py2.py3-none-any.whl - 有问题的二进制分布.我创建了两个新的虚拟环境,都使用Python 2.7.5,并安装了每个包(pip install multigtfs-0.4.2.tar.gz).这两种环境几乎完全相同.它们有不同的.pyc文件,即"已编译"的Python文件.有记录磁盘上不同路径的日志文件.源tar球multigtfs-0.4.2-py27.egg-info的安装包括一个文件夹,详细说明安装,并且wheel安装有一个multigtfs-0.4.2.dist-info文件夹,其中包含该进程的详细信息.但是,从使用multigtfs项目的代码的角度来看,两种安装方法之间没有区别.
显然,我的测试使用的.zip文件都没有,因此测试套件将失败:
$ django-admin startproject demo
$ cd demo
$ pip install psycopg2 # DB driver for PostGIS project
$ createdb demo # Create PostgreSQL database
$ psql -d demo -c "CREATE EXTENSION postgis" # Make it a PostGIS database
$ vi demo/settings.py # Add multigtfs to INSTALLED_APPS,
# Update DATABASE to set ENGINE to django.contrib.gis.db.backends.postgis
# Update DATABASE to set NAME to test
$ ./manage.py test multigtfs.tests # Run the tests
...
IOError: [Errno 2] No such file or directory: u'/Users/john/.virtualenvs/test/lib/python2.7/site-packages/multigtfs/tests/fixtures/test3.zip'
Run Code Online (Sandbox Code Playgroud)
使用答案中的建议,我添加了一些额外的指令setup.py:
from __future__ import unicode_literals
# setup.py now requires some funky binary strings
...
setup(
name='multigtfs',
packages=find_packages(),
package_data={b'multigtfs': ['test/fixtures/*.zip']},
include_package_data=True,
...
)
Run Code Online (Sandbox Code Playgroud)
这会将zip文件(以及README)安装到该文件夹,现在测试正确运行.谢谢你的建议!
vge*_*gel 31
你是否尝试过使用package_data你的setup.py?MANIFEST.in似乎针对python版本<= 2.6,我不确定更高版本是否会看到它.
在浏览https://github.com/pypa/sampleproject后,他们MANIFEST.in说:
# If using Python 2.6 or less, then have to include package data, even though
# it's already declared in setup.py
include sample/*.dat
Run Code Online (Sandbox Code Playgroud)
这似乎意味着这种方法已经过时了.同时,setup.py他们宣布:
setup(
name='sample',
...
# If there are data files included in your packages that need to be
# installed, specify them here. If using Python 2.6 or less, then these
# have to be included in MANIFEST.in as well.
package_data={
'sample': ['package_data.dat'],
},
...
)
Run Code Online (Sandbox Code Playgroud)
(我不确定为什么他们选择了一个通配符MANIFEST.in和一个文件名setup.py.它们引用同一个文件)
随着更简单,再次似乎暗示该package_data路线优于该MANIFEST.in方法.好吧,除非你必须支持2.6,在这种情况下,我的祈祷会发给你.
cmc*_*nty 18
你之前所做的任何更改的MANIFEST.in或setup.py必须删除旧的输出目录.Setuptools正在缓存一些数据,这可能会导致意外结果.
rm -rf build *.egg-info
Run Code Online (Sandbox Code Playgroud)
如果您不这样做,则无法正常工作.
现在已经不在了.
如果您正在构建源分发(sdist),那么您可以使用下面的任何方法.
如果你正在建设一个轮子(bdist_wheel),然后include_package_data和MANIFEST.in被忽略,并且必须使用package_data和data_files.
这是一个不错的选择,但bdist_wheel不尊重它.
setup(
...
include_package_data=True
)
# MANIFEST.in
include package/data.json
Run Code Online (Sandbox Code Playgroud)
这是最灵活的选项,因为您可以将您的仓库中的任何文件添加到sdist或bdist_wheel
setup(
....
data_files=[
('output_dir',['conf/data.json']),
]
# For sdist, output_dir is ignored!
#
# For bdist_wheel, data.json from conf dir in root of your repo
# and stored at `output_dir/` inside of the sdist package.
)
Run Code Online (Sandbox Code Playgroud)
与上面类似,但是对于bdist_wheellet,你将数据文件放在包中.它是相同的,sdist但有更多的限制,data_files因为文件只能来自您的包子目录.
setup(
...
package_data={'package':'data.json'},
# data.json must be inside of your actual package
)
Run Code Online (Sandbox Code Playgroud)
gab*_*ous 12
您可以使用package_data,并data_files在setup.py指定的其他文件,但他们是可笑很难得到正确(和越野车).
另一种方法是使用MANIFEST.in和添加include_package_data=True在setup()你的setup.py作为在此间表示.
使用此指令,MANIFEST.in将用于指定不仅包含在源tarball/zip中的文件,还包括wheel和win32安装程序中的文件.这也适用于任何python版本(我测试了从py2.6到py3.6的项目).
laz*_*zy1 10
您可以使用data_files指令指定要安装的额外文件.这就是你要找的东西吗?这里有一个小例子:
from setuptools import setup
from glob import glob
setup(
name='extra',
version='0.0.1',
py_modules=['extra'],
data_files=[
('images', glob('assets/*.png')),
],
)
Run Code Online (Sandbox Code Playgroud)
include_package_data是要走的路,它适用于 sdist和wheels。
然而,你必须做得正确,我花了几个月的时间才弄清楚这一点,所以这就是我学到的东西。
技巧本质上是在选项名称中给出的include_PACKAGE_data:数据文件需要位于包子文件夹中
当且仅当
include_package_data是真的MANIFEST.in(*另请参阅我在末尾的注释setuptools_scm)然后数据文件将被包括在内。
鉴于该项目具有以下结构和文件:
|- MANIFEST.in
|- setup.cfg
|- setup.py
|
\---foo
|- __init__.py
|
\---data
- example.png
Run Code Online (Sandbox Code Playgroud)
以及以下配置:
清单中:
recursive-include foo/data *
Run Code Online (Sandbox Code Playgroud)
安装程序.py
import setuptools
setuptools.setup()
Run Code Online (Sandbox Code Playgroud)
安装程序.cfg
[metadata]
name = wheel-data-files-example
url = www.example.com
maintainer = None
maintainer_email = none@example.com
[options]
packages =
foo
include_package_data = True
Run Code Online (Sandbox Code Playgroud)
sdist 包和您构建的轮子也将包含example.png数据文件。
(当然,也可以直接在setup.py中指定配置,而不是setup.cfg。但这与示例无关。)
这也适用于使用 src 布局的项目,如下所示:
|- MANIFEST.in
|- setup.cfg
|- setup.py
|
\---src
|
\---foo
|- __init__.py
|
\---data
- example.png
Run Code Online (Sandbox Code Playgroud)
要使其正常工作,请使用以下命令告诉 setuptools 有关 src 目录的信息package_dir:
安装程序.cfg
[metadata]
name = wheel-data-files-example
url = www.example.com
maintainer = None
maintainer_email = none@example.com
[options]
packages =
foo
include_package_data = True
package_dir =
=src
Run Code Online (Sandbox Code Playgroud)
并在清单中调整路径:
清单中:
recursive-include src/foo/data *
Run Code Online (Sandbox Code Playgroud)
setuptools_scm如果您碰巧使用 setuptools 并添加setuptools_scm插件(在 pypi 上),那么您不需要管理 Manifest.in 文件。相反,setuptools_scm 将负责将 git 跟踪的所有文件添加到包中。
因此,对于这种情况,是否将文件添加到 sdist/wheel 的规则是:当且仅当
include_package_data是真的然后数据文件将被包括在内。