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

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控制包含和排除的文件,以及pyromacheck-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.pyMANIFEST.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.insetup.py必须删除旧的输出目录.Setuptools正在缓存一些数据,这可能会导致意外结果.

rm -rf build *.egg-info
Run Code Online (Sandbox Code Playgroud)

如果您不这样做,则无法正常工作.

现在已经不在了.

  1. 如果您正在构建源分发(sdist),那么您可以使用下面的任何方法.

  2. 如果你正在建设一个轮子(bdist_wheel),然后include_package_dataMANIFEST.in被忽略,并且必须使用package_datadata_files.

INCLUDE_PACKAGE_DATA

这是一个不错的选择,但bdist_wheel不尊重它.

setup(
    ...
    include_package_data=True
)

# MANIFEST.in
include package/data.json
Run Code Online (Sandbox Code Playgroud)

DATA_FILES用于非包数据

这是最灵活的选项,因为您可以将您的仓库中的任何文件添加到sdistbdist_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)

PACKAGE_DATA用于包内的非python文件

与上面类似,但是对于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)

  • 评论“INCLUDE_PACKAGE_DATA 是一个不错的选择,但 bdist_wheel 不尊重它”:这并不完全正确,应该在答案中澄清:如果数据文件包含在包子目录之一中并且 `include_package_data=True` 并且它们列在“Manifest.in”中,然后它们将被包含在内。 (2认同)

gab*_*ous 12

您可以使用package_data,并data_filessetup.py指定的其他文件,但他们是可笑很难得到正确(和越野车).

另一种方法是使用MANIFEST.in和添加include_package_data=Truesetup()你的setup.py作为在此间表示.

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

  • 这应该是当前接受的答案!在另一个答案中使用 `package_data=...` 充满危险(阅读链接,以及链接背后的链接) (4认同)

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)

  • 这看起来非常有希望,但在2小时后我无法获得data_files或package_files.您是否知道使用这些功能的任何项目我可以查找工作代码? (3认同)

Ste*_* D. 5

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 布局项目

这也适用于使用 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)

注意:如果您使用,则无需 Manifest.insetuptools_scm

如果您碰巧使用 setuptools 并添加setuptools_scm插件(在 pypi 上),那么您不需要管理 Manifest.in 文件。相反,setuptools_scm 将负责将 git 跟踪的所有文件添加到包中。

因此,对于这种情况,是否将文件添加到 sdist/wheel 的规则是:当且仅当

  • include_package_data是真的
  • 该文件由 git (或其他 setuptools_scm 支持的工具)跟踪
  • 数据文件位于包目录下

然后数据文件将被包括在内。