如何将其他文件添加到车轮?

如何控制车轮中包含哪些文件? 似乎python setup.py bdist_wheel未使用python setup.py sdist

更新:

我错了从源tarball安装与安装轮子之间的区别。 源代码分发包含python setup.py sdist中指定的文件,但已安装的软件包仅包含python文件。 无论是通过源分发,egg还是wheel安装,都需要采取步骤来确定应安装的其他文件。 即,附加软件包文件需要package_data,而软件包外部文件(例如命令行脚本或系统配置文件)需要data_files。

原始问题

我有一个项目,在这个项目中,我一直在使用python setup.py sdist来构建我的包,使用274607739305931616736来控制包含和排除的文件,并使用pyroma和check-manifest来确认我的设置。

我最近将其转换为双重Python 2/3代码,并添加了setup.cfg

[bdist_wheel]
universal = 1

我可以用setup.py制作一个轮子,并且它似乎是所需的通用轮子。 但是,它不包括274607739305931616737中指定的所有文件。

安装了什么?

我更深入地研究,现在对包装和车轮有了更多的了解。 这是我学到的:

我将两个包文件上传到PyPi上的multigtfs项目:

  • setup.py-源tar球,其中包括.pyc中的所有文件。
  • setup.py-有问题的二进制分发。

我创建了两个新的虚拟环境,都使用Python 2.7.5,并安装了每个软件包(setup.py)。 两种环境几乎相同。 它们具有不同的.pyc文件,它们是“已编译”的Python文件。 有些日志文件记录磁盘上的不同路径。 从源tar球进行的安装包括一个详细说明安装的文件夹274607739305931616738,而车轮安装具有一个274607739305931616739文件夹,其中包含该过程的详细信息。 但是,从使用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文件(以及自述文件)安装到该文件夹中,并且测试现在可以正确运行。 感谢您的建议!

jwhitlock asked 2020-02-13T17:59:06Z
6个解决方案
31 votes

您是否尝试过在MANIFEST.in中使用package_dataMANIFEST.in似乎是针对<= 2.6的python版本的,我不确定是否还会使用更高版本的python。

在探索[https://github.com/pypa/sampleproject之后,]他们的package_data说:

# 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

这似乎暗示此方法已过时。 同时,他们在package_data中声明:

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'],
    },
    ...
)

(我不确定为什么他们在package_data中选择了通配符,而在MANIFEST.in中选择了文件名。它们引用相同的文件)

除了更简单之外,它似乎还暗示package_data路线优于MANIFEST.in方法。 好吧,除非您必须支持2.6,在这种情况下,我的祈祷会向您发出。

vgel answered 2020-02-13T17:59:43Z
17 votes

bdist_wheelsdist中进行任何更改之前,必须删除旧的输出目录。 Setuptools正在缓存某些数据,这可能会导致意外结果。

rm -rf build *.egg-info

如果您不这样做,则指望没有任何东西能正常工作。

现在,这已不复存在。

  1. 如果要构建源分发(bdist_wheel),则可以使用以下任何方法。

  2. 如果您要构建轮子(bdist_wheel),则将忽略sdistdata_files,而必须使用package_datadata_files

INCLUDE_PACKAGE_DATA

这是一个不错的选择,但是bdist_wheel不接受它。

setup(
    ...
    include_package_data=True
)

# MANIFEST.in
include package/data.json

DATA_FILES用于非打包数据

这是最灵活的选项,因为您可以将仓库中的任何文件添加到bdist_wheelsdist

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.
)

包内非Python文件的PACKAGE_DATA

与上面类似,但是对于bdist_wheel,我们将数据文件放入包中。 它与sdist相同,但比data_files具有更多限制,因为文件只能从包子目录中获取。

setup(
    ...
    package_data={'package':'data.json'},
    # data.json must be inside of your actual package
)
cmcginty answered 2020-02-13T18:00:48Z
12 votes

您可以在setup()中使用MANIFEST.ininclude_package_data=True来指定其他文件,但是它们很难正确处理(并且容易出错)。

替代方法是使用MANIFEST.in,并在setup.pysetup()中添加include_package_data=True,如此处所示。

使用此指令,MANIFEST.in将用于指定文件,不仅包括在源tarball / zip中,而且包括在wheel和win32安装程序中。 这也适用于任何python版本(我在py2.6到py3.6的项目中进行了测试)。

gaborous answered 2020-02-13T18:01:17Z
10 votes

您可以使用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')),
    ],
)
lazy1 answered 2020-02-13T18:01:37Z
0 votes

我的config /目录中包含JSON文件,需要将其添加到wheel包中。 因此,我将这些行添加到__init__.py

recursive-include config/ *.json

以下指令指向__init__.py

setup(
 ...
 include_package_data=True,
)

没有任何效果。直到我在config/目录中创建了一个名为__init__.py的空文件。

(Python 3.6.7,wheel 3.6.7,setuptools 39.0.1)

Michael Spector answered 2020-02-13T18:02:11Z
-6 votes

“车轮是ZIP格式的存档...”([http://wheel.readthedocs.org/en/latest)]

因此,请像对待.zip文件一样对待.whl文件。 添加文件:

  • Python ZipFile对象
  • 任何存档/ zip文件实用程序,例如7-zip,Winzip,Ark,文件卷轴等。
snapshoe answered 2020-02-13T18:02:52Z
translate from https://stackoverflow.com:/questions/24347450/how-do-you-add-additional-files-to-a-wheel