如何控制wheel中包含哪些文件?MANIFEST.in
似乎没有被python setup.py bdist_wheel
使用。
更新:
我对从源代码tarball安装和从wheel安装之间的区别判断错误。源代码发行版包括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
构建一个wheel,它看起来像是一个通用的wheel。但是,它并不包括MANIFEST.in
中指定的所有文件。
安装了哪些内容?
我深入挖掘,现在对 Package 和车轮有了更多的了解。以下是我学到的:
我将两个软件包文件上传到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
,详细说明了安装过程。并且wheel install有一个multigtfs-0.4.2.dist-info
文件夹,其中包含该过程的详细信息。
明确地说,我的测试所使用的.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文件(以及自述文件)安装到文件夹中,测试现在可以正确运行了。感谢您的建议!
7条答案
按热度按时间k5ifujac1#
你有没有试过在你的
setup.py
中使用package_data
?MANIFEST.in
似乎是针对python版本〈= 2.6,我不确定更高的版本是否会考虑它。在探索了https://github.com/pypa/sampleproject之后,他们的
MANIFEST.in
说:这似乎意味着这个方法已经过时了。同时,在
setup.py
中,它们声明:(我不知道他们为什么在
MANIFEST.in
中选择通配符,而在setup.py
中选择文件名。它们引用同一个文件)沿着更简单之外,这似乎再次暗示了
package_data
路由上级MANIFEST.in
方法。好吧,除非你必须支持2.6,在这种情况下,我为你祈祷。rggaifut2#
在
MANIFEST.in
或setup.py
中进行任何更改之前,必须删除旧的输出目录。Setuptools正在缓存某些数据,这可能会导致意外结果。如果您不这样做,就无法正常工作。
既然是碍事的。
1.如果您正在构建一个源分发(
sdist
),那么您可以使用下面的任何方法。1.如果您正在建置wheel(
bdist_wheel
),则会忽略include_package_data
和MANIFEST.in
,而您必须使用package_data
和data_files
。包含包数据
这是一个很好的选择,但是
bdist_wheel
不荣誉它。DATA_FILES用于非程序包数据
这是最灵活的选项,因为您可以将存储库中的任何文件添加到
sdist
或bdist_wheel
PACKAGE_DATA用于软件包内的非python文件
与上面类似,但是对于
bdist_wheel
,让你把你的数据文件放在包里面。对于sdist
,这是相同的,但是比data_files
有更多的限制,因为文件只能从你的包子目录中获取。jum4pzuy3#
您可以在
setup.py
中使用package_data
和data_files
来指定其他档案,但它们是ridiculously hard to get right (and buggy)。另一种方法是使用
MANIFEST.in
,并将include_package_data=True
添加到setup.py
的setup()
中,作为indicated here。通过这个指令,
MANIFEST.in
将被用来指定文件不仅包括在源代码tarball/zip中,而且包括在wheel和win32安装程序中。这也适用于任何python版本(我在一个从py2.6到py3.6的项目上测试过)。2020年更新:看起来MANIFEST.inPython 3中的wheel不再支持www.example.com,尽管它仍然在tar.gz中,即使您设置了
include_package_data=True
。以下是解决该问题的方法:您需要同时指定
include_package_data
和packages
。如果你的Python模块在“pymod”文件夹中,这里有足够的设置:
如果您的python脚本位于根目录下,请用途:
然后,您可以使用zip存档软件(如7-zip)打开您的.whl文件,以检查您想要的所有文件是否都在里面。
tkqqtvp14#
你可以使用data_files指令指定要安装的额外文件。这就是你要找的吗?下面是一个小例子:
ddhy6vgd5#
include_package_data
是要走的路,它对sdist和wheels有效。然而,你必须做对,我花了几个月的时间才弄清楚这一点,所以这是我学到的。
这个技巧基本上是在选项
include_PACKAGE_data
的名称中给出的:数据文件需要位于软件包子文件夹中当且仅当
include_package_data
为真MANIFEST.in
中(* 也可参见我在最后关于setuptools_scm
的注解)则将包括数据文件。
工作示例:
假设项目具有以下结构和文件:
并进行如下配置:
setup.py
sdist包和您构建的wheels也将包含
example.png
数据文件。(of当然,也可以在setup.py中直接指定配置,而不是setup.cfg。但这与示例无关。)
更新:对于src布局项目
这也适用于使用src布局的项目,如下所示:
要使其正常工作,请使用
package_dir
告诉setuptools src目录:并在清单中调整路径:
注意:Manifest.in如果您使用
setuptools_scm
,则不需要www.example.com如果你碰巧使用setuptools并添加了
setuptools_scm
插件(on pypi),那么你就不需要管理Manifest.in文件,而setuptools_scm会负责将所有被git跟踪的文件添加到包中。因此,在这种情况下,是否将文件添加到sdist/wheel的规则是:当且仅当
include_package_data
为真则将包括数据文件。
s8vozzvw6#
我有一个config/目录,里面有JSON文件,我需要把它添加到wheel包中。
下面的指令指向
setup.py
:直到我在
config/
目录中创建了一个名为__init__.py
的空文件。(Python 3.6.7,转轮3.6.7,设置工具39.0.1)
yr9zkbsy7#
要将文件直接添加到wheel的顶层(而不是wheel内的文件夹下),只需使用Poetry。
将依赖项移植到:
在
pyproject.toml
中添加这样一行然后运行:
注意:IntelliJ产品使您可以轻松快速地浏览带有this插件的控制盘。