Как использовать "setup.cfg" вместо setup.py с Python 2.7

Мне показалось, что вместо всего множества названных ключевых слов-аргументов для distutils.core.setup, можно использовать файл setup.cfg в том же каталоге как файл setup.py, и все эти ключевые слова будут считаны из файла setup.cfg.

Я думал, что могу просто создать setup.cfg с Python 2.7, но минимальное тестирование версия просто не работает. Я проверил его с помощью setup.py --name, который просто возвращает: UNKNOWN.

И, как обычно, с упаковкой python документация сбивает с толку, как никогда неясно, к какой версии они относятся или, по крайней мере, сколько лет документация есть.

Два моих файла настроек:

setup.py:

from distutils.core import setup
setup()

setup.cfg:

[metadata]
name = foo
version = 0.1

Я заглянул в пакет distutils и обнаружил, что (помимо того, что он был уродливым, как ад) кажется использовать mail.message_from_file factory для чтения setup.cfg.

Как я вполне согласен с setup.py -один подход, я бы не стал намного дольше с такой ерундой, но мне все еще любопытно, как это сделать правильно, если это вообще возможно.

Ни официальный официальный документ по упаковке, ни Packaging-Authority, по-видимому, здесь большая помощь.


Почти каждый раз, когда я чувствую себя вынужденным заглянуть в python 2.x stdlib, мне интересно, если они попробуйте продемонстрировать, как не программировать. С другой стороны, C-Code выглядит довольно красивым.

Ответы

Ответ 1

Проблема заключается в том, что файл setup.cfg не делает то, что вы хотите. Он не предоставляет параметры функции setup. Он используется для подачи параметров командам, которые setup.py делает доступными. Список поддерживаемых команд можно указать с помощью setup.py --help-команд. Вы должны увидеть что-то вроде:

(env) gondolin/zender% ./setup.py --help-commands
Standard commands:
  build             build everything needed to install
  build_py          "build" pure Python modules (copy to build directory)
  .....
  install_data      install data files
  sdist             create a source distribution (tarball, zip file, etc.)

Это список разделов, которые вы можете поместить в файл setup.cfg. Вы можете указать параметры, поддерживаемые командой, с помощью команды setup.py --help. Например, команда sdist поддерживает следующие параметры:

(env) gondolin/zender% ./setup.py --help sdist
Common commands: (see '--help-commands' for more)
....
Options for 'sdist' command:
  --formats         formats for source distribution (comma-separated list)
  --keep-temp (-k)  keep the distribution tree around after creating archive
                    file(s)
  --dist-dir (-d)   directory to put the source distribution archive(s) in
                    [default: dist]
  --help-formats    list available distribution formats

Вы можете контролировать, что происходит, когда пользователь запускает ./setup.py sdist в вашем проекте, добавив файл setup.cfg, как показано ниже.

[sdist]
keep-temp = 1
dist-dir = dist/source

Итак... setup.cfg просто настраивает поведение различных команд настройки для вашего проекта. Функция setup действительно должна иметь метаданные, предоставленные ей как параметры ключевых слов. Вы можете написать свою собственную версию класса distutils.dist.Distribution, которая вытаскивает метаданные из файла setup.cfg и предоставляет ее как параметр ключевого слова distclass= для setup.

Недостатком части головоломки является то, что стандартный класс Distribution не предоставляет способ передать параметр path в инициализатор distutils.dist.DistributionMetadata, который делает в значительной степени то, что вы хотите, - он считывает информацию о пакете, используя которые вы упомянули. Вы обнаружили код, который используется для обработки файла метаданных PEP-314/PEP-345. Это не используется функцией setup. Вместо этого он используется для анализа метаданных, встроенных в распределенный пакет.

Ответ 3

Отказ от ответственности. Следующие примечания верны для python 2.7 с пакетом stdlib distutils. Они могут быть вводящими в заблуждение или ложными для других версий.

Независимо от D. Shawleys очень сложный и сложный ответ, я пришел к таким же выводам и решил сделать тривиальное решение для декларативных метаданных.

Так что для всех, кто застрял в одном и том же вопросе и не хочет потерять много времени на таких мелочах, вот краткий обзор проблем setup.cfg:

  • setup() использование setup.cfg не позволяет объявлять имя, версию, лицензию и аналогичные метаданные для всех предоставленных команд в общем виде
  • вы должны использовать ключевое слово-аргументы setup() для определения метаданных
  • все разделы setup.cfg называются после команд и изменяют поведение функции setup() см. ответ D.Shawleys
  • вы могли бы определить метаданные очень избыточным способом для каждой команды отдельно
  • вы можете использовать собственное имя раздела для пользовательских команд. Вы можете использовать эту возможность для реализации своего собственного решения, как я сделал.

Таким образом, с учетом этих данных я реализовал решение Q & D ™, которое позволяет использовать setup.cfg -секцию:

[metadata]
name = foo
version = 0.1

и setup.py с:

distutils.core.setup(**metadata_from_setupcfg())

В основном я взял distutils2-решение в качестве ориентации и избегал необходимости делать дополнительный импорт с дополнительным путём в setup.py script, используя execfile.

Существует образцовый смысл для интересующего.