python 如何将其他档案加入至操控盘?

k7fdbhmy  于 2022-10-30  发布在  Python
关注(0)|答案(7)|浏览(123)

如何控制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来控制包括和排除的文件,pyromacheck-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文件(以及自述文件)安装到文件夹中,测试现在可以正确运行了。感谢您的建议!

k5ifujac

k5ifujac1#

你有没有试过在你的setup.py中使用package_dataMANIFEST.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

这似乎意味着这个方法已经过时了。同时,在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.
    include_package_data=True,
    package_data={
        'sample': ['package_data.dat'],
    },
    ...
)

(我不知道他们为什么在MANIFEST.in中选择通配符,而在setup.py中选择文件名。它们引用同一个文件)
沿着更简单之外,这似乎再次暗示了package_data路由上级MANIFEST.in方法。好吧,除非你必须支持2.6,在这种情况下,我为你祈祷。

rggaifut

rggaifut2#

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

rm -rf build *.egg-info

如果您不这样做,就无法正常工作。

既然是碍事的。
1.如果您正在构建一个源分发sdist),那么您可以使用下面的任何方法。
1.如果您正在建置wheelbdist_wheel),则会忽略include_package_dataMANIFEST.in,而您必须使用package_datadata_files

包含包数据

这是一个很好的选择,但是bdist_wheel不荣誉它。

setup(
    ...
    include_package_data=True
)

# MANIFEST.in

include package/data.json

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

PACKAGE_DATA用于软件包内的非python文件

与上面类似,但是对于bdist_wheel,让你把你的数据文件放在包里面。对于sdist,这是相同的,但是比data_files有更多的限制,因为文件只能从你的包子目录中获取。

setup(
    ...
    package_data={'package':'data.json'},
    # data.json must be inside of your actual package
)
jum4pzuy

jum4pzuy3#

您可以在setup.py中使用package_datadata_files来指定其他档案,但它们是ridiculously hard to get right (and buggy)
另一种方法是使用MANIFEST.in,并将include_package_data=True添加到setup.pysetup()中,作为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_datapackages
如果你的Python模块在“pymod”文件夹中,这里有足够的设置:

setup( ...
    include_package_data = True,
    packages = ['pymod'],
)

如果您的python脚本位于根目录下,请用途:

setup( ...
    include_package_data = True,
    packages = ['.'],
)

然后,您可以使用zip存档软件(如7-zip)打开您的.whl文件,以检查您想要的所有文件是否都在里面。

tkqqtvp1

tkqqtvp14#

你可以使用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')),
    ],
)
ddhy6vgd

ddhy6vgd5#

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

并进行如下配置:

  • 货单位置:*
recursive-include foo/data *

setup.py

import setuptools

setuptools.setup()
  • 安装程序.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

sdist包和您构建的wheels也将包含example.png数据文件。
(of当然,也可以在setup.py中直接指定配置,而不是setup.cfg。但这与示例无关。)

更新:对于src布局项目

这也适用于使用src布局的项目,如下所示:

|- MANIFEST.in
|- setup.cfg
|- setup.py
|
\---src
    |
    \---foo
        |- __init__.py
        |
        \---data
             - example.png

要使其正常工作,请使用package_dir告诉setuptools src目录:

  • 安装程序.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

并在清单中调整路径:

  • 货单位置:*
recursive-include src/foo/data *

注意:Manifest.in如果您使用setuptools_scm,则不需要www.example.com

如果你碰巧使用setuptools并添加了setuptools_scm插件(on pypi),那么你就不需要管理Manifest.in文件,而setuptools_scm会负责将所有被git跟踪的文件添加到包中。
因此,在这种情况下,是否将文件添加到sdist/wheel的规则是:当且仅当

  • include_package_data为真
  • 该文件由git(或另一个setuptools_scm支持的工具)跟踪
  • 数据文件在包目录下

则将包括数据文件。

s8vozzvw

s8vozzvw6#

我有一个config/目录,里面有JSON文件,我需要把它添加到wheel包中。

recursive-include config/ *.json

下面的指令指向setup.py

setup(
 ...
 include_package_data=True,
)

直到我在config/目录中创建了一个名为__init__.py的空文件。
(Python 3.6.7,转轮3.6.7,设置工具39.0.1)

yr9zkbsy

yr9zkbsy7#

要将文件直接添加到wheel的顶层(而不是wheel内的文件夹下),只需使用Poetry

poetry init

将依赖项移植到:

cat requirements.txt | xargs poetry add

pyproject.toml中添加这样一行

include = ["Yourfile"]

然后运行:

poetry build

注意:IntelliJ产品使您可以轻松快速地浏览带有this插件的控制盘。

相关问题