一尘不染

如何将其他文件添加到转盘?

python

如何控制转盘中包含哪些文件?似乎MANIFEST.in没有被使用python setup.py bdist_wheel

更新

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

原始问题

我有一个项目,我一直在使用python setup.py sdist来构建我的包,MANIFEST.in以控制包括和排除的文件,并pyroma退房清单,以确认我的设置。

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

[bdist_wheel]
universal = 1

我可以用构建轮子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的安装包括一个文件夹(详细说明安装),而轮式安装有一个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文件(以及自述文件)安装到该文件夹​​中,并且测试现在可以正确运行。感谢您的建议!


阅读 155

收藏
2020-12-20

共1个答案

一尘不染

你有没有尝试使用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

这似乎暗示此方法已过时。同时,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'],
    },
    ...
)

(我不确定他们为什么选择其中的通配符MANIFEST.in和中的文件名setup.py。它们引用相同的文件)

再简单一点,这似乎又暗示该package_data路线优于该MANIFEST.in方法。好吧,除非您必须支持2.6,在这种情况下,我的祈祷会向您发出。

2020-12-20