Как * установить * дополнительные данные пакета с помощью setuptools? - PullRequest
1 голос
/ 09 ноября 2019

Это выглядит очень похоже на этот вопрос , но это не совсем.

Ответы на этот вопрос охватывают, как получить дополнительные данные в исходный и двоичный дистрибутивы,но на самом деле не рассматривается, как получить данные пакета установлен при включении в исходный дистрибутив, или как их установить в файле wheel.

Вот пример того, что я имею в виду (python 3.7.4):

% ls
MANIFEST.in README.txt  foopackage  setup.py    venv

% cat setup.py
# -*- coding: utf-8 -*-

from setuptools import setup, find_packages

setup(
    name='foopackage',
    version='0.0.1',
    description='A Package Full of Foo',
    packages=find_packages(),
    package_data={
        'foopackage': [
            'README.txt',
        ],
    },
    include_package_data=True,
)

% cat MANIFEST.in
include README.txt

% . venv/bin/activate
(venv)
% python setup.py sdist bdist_wheel
[...]
% ls dist
foopackage-0.0.1-py3-none-any.whl foopackage-0.0.1.tar.gz
(venv)
% unzip -v dist/foopackage-0.0.1-py3-none-any.whl| grep README.txt
(venv)
% tar tvzf dist/foopackage-0.0.1.tar.gz| grep README.txt
-rw-r--r--  0 matt   staff       0  8 Nov 17:21 foopackage-0.0.1/README.txt
(venv)
% deactivate

% cd ../foo

% . py/bin/activate
(py)
% pip install ../foopackage/dist/foopackage-0.0.1.tar.gz
Processing ../foopackage/dist/foopackage-0.0.1.tar.gz
Installing collected packages: foopackage
  Found existing installation: foopackage 0.0.1
    Uninstalling foopackage-0.0.1:
      Successfully uninstalled foopackage-0.0.1
  Running setup.py install for foopackage ... done
Successfully installed foopackage-0.0.1
You are using pip version 19.0.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
(py)
% find . -name README.txt
(py)
%

Файл README.txt не включен в wheel, и, несмотря на то, что он включен в файл sdist, он не устанавливается при установке этого пакета.

Я не могу найти волшебное заклинание, чтобы заставить setuptools фактически установить этот файл где-нибудь. Чего мне не хватает?

Я, вероятно, должен указать, что реальный пакет, который я собираю, должен быть совместимым с py27 и py34 +, на случай, если это каким-либо образом ограничивает решение.

1 Ответ

2 голосов
/ 09 ноября 2019

Проблема в

package_data={
    'foopackage': [
        'README.txt',
    ],
},

С этим кодом вы заявляете, что ваш foopackage содержит файл README.txt (шаблоны файлов в package_data обрабатываются относительно пакетов, к которым они принадлежат). Но это не так! Файл находится в корневой папке, а не в подпапке foopackage/. Это также причина, по которой файл не включен в ваши колеса.

Указав файл в MANIFEST.in, вы заставили setuptools включить файл в исходный дистрибутив, но setuptools не делает 'не знает, что делать с файлом - он ожидает, что файл будет внутри foopackage/.

Существует два способа решения проблемы. Во-первых, вы можете объявить относительный путь к файлу:

package_data={
    'foopackage': [
        '../README.txt',
    ],
},

В этом случае заливка будет установлена ​​в foopackage/../README.txt, то есть в каталог site-packages/. Это может быть то, что вы хотите.

Или нет. В этом случае правильное решение - переместить файл в foopackage/, исправить MANIFEST.in и пересобрать sdist и wheel (s).

...