【发布时间】:2014-08-12 09:40:03
【问题描述】:
如何控制轮子中包含哪些文件? MANIFEST.in 似乎没有被 python setup.py bdist_wheel 使用。
更新:
我对从源 tarball 安装与从轮子安装之间的区别是错误的。源码分发包含MANIFEST.in中指定的文件,但安装的包只有python文件。需要采取步骤来识别应安装的其他文件,无论安装是通过源代码分发、egg 还是 wheel。也就是说,额外的包文件需要package_data,而包外的文件(如命令行脚本或系统配置文件)需要data_files。
原始问题
我有a project,我一直使用python setup.py sdist 构建我的包,MANIFEST.in 控制包含和排除的文件,pyroma 和check-manifest 确认我的设置。
我最近将其转换为双 Python 2 / 3 代码,并添加了一个 setup.cfg 与
[bdist_wheel]
universal = 1
我可以用python setup.py bdist_wheel 制作一个轮子,它似乎是一个万能轮子。但是,它不包括MANIFEST.in 中指定的所有文件。
安装了什么?
我挖得更深了,现在对包装和轮子有了更多的了解。这是我学到的:
我上传了两个包文件到multigtfs project on PyPi:
-
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,详细说明了安装,而轮子安装有一个 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'
指定附加文件
使用答案中的建议,我向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,
...
)
这会将 zip 文件(以及 README)安装到文件夹中,并且测试现在可以正常运行。感谢您的建议!
【问题讨论】:
-
缺少哪些文件?
-
任何非 Python 文件,例如文档或测试装置。我的应用程序包含一些在测试中使用的 .zip 文件,有些人可能认为二进制分发中不需要这些文件。其他人可能有运行时需要的非 Python 文件。
-
我很难理解你的问题。 setup.py应该如何在轮子中包含文件(标签描述为空,所以我不知道你指的是什么)?
-
wheel 是 Python 的内置包格式,如果两者都可用,则通常优于 .egg 格式。要构建一个轮子,请运行
python setup.py bdist_wheel。请参阅wheel.readthedocs.org(不回答我的问题)和pythonwheels.com 的文档。 -
神奇的组合是使用
MANIFEST.in指定文件,然后在setup.py中添加include_package_data=True。
标签: python pip python-wheel