Ограничить пакет до CPython — setup.cfg

Я использую pyproject.toml и setup.cfg по PEP-517.

У меня есть setup.cfg следующим образом:

[metadata]
name = Package
version = 1.0.0

[options]
py_modules = ...
python_requires = >=3

Я хочу ограничить работу пакета только на CPython, поскольку он решает проблему, связанную с реализацией.

Я пытался использовать маркеры среды, но, к сожалению, они не работают в поле python_requires:

python_requires = >=3; implementation_name == "cpython"

Есть ли способ добиться того, чего я хочу, не прибегая к устаревшему setup.py?


person Bharel    schedule 21.01.2021    source источник
comment
вы можете попробовать взломать, как install-requires=this-package-requires-cpython;implementation_name != "cpython"   -  person Anthony Sottile    schedule 21.01.2021
comment
Да, я думал использовать этот хак. Хотя не нравится. Интересно, есть ли реальный способ сделать это.   -  person Bharel    schedule 22.01.2021
comment
Если вы создаете колесо, вы можете ограничить реализацию в теге совместимости, например. python setup.py bdist_wheel --python-tag=cp3 создаст <pkg>-<ver>-cp3-none-any.whl, который будет установлен только с внедрением CPython. Боюсь, что для исходных дистрибутивов вам придется прибегнуть к ручной проверке в скрипте setup.py.   -  person hoefling    schedule 22.01.2021
comment
@hoefling Спасибо за совет, но для использования bdist_wheel мне все еще нужен setup.py (который является частью вашей командной строки). Я попытался запустить параметр сборки с помощью pip wheel --build-option python-tag=cp3 ., но, похоже, он не поддерживается для сборок PEP 517. Я предполагаю, что ответ заключается в том, что пока это просто невозможно.   -  person Bharel    schedule 22.01.2021
comment
Ах, моя вина, что я неправильно прочитал ваш вопрос. Это еще проще сделать с setup.cfg; просто добавьте раздел [bdist_wheel] с записью python-tag=cp3. Это, вероятно, также решит случай с sdist, если setup.cfg будет включено в исходный dist и использовано для построения колеса при pip installing; не уверен, поскольку не знаю, как создать sdist из декларативной конфигурации PEP 517.   -  person hoefling    schedule 23.01.2021
comment
А, хорошо, я нашел это - используя build, можно также построить sdist из чистая декларативная конфигурация сборки; setup.cfg включен, а pip install из исходного дистрибутива также работает, как и ожидалось.   -  person hoefling    schedule 23.01.2021
comment
@hoefling О, это потрясающе! Именно то, что я искал. Как вы нашли документацию по разделу [bdist_wheel]? Я никогда не обходил это стороной. Не могли бы вы добавить источник документации или способ, которым вы его нашли, вместе со своим ответом? Буду признателен. Напишите как ответ, чтобы я мог принять это :-)   -  person Bharel    schedule 23.01.2021
comment
@hoefling Честно говоря, я даже не нашел онлайн-документацию для команды python-tag. Я что-то упускаю?   -  person Bharel    schedule 23.01.2021
comment
Ознакомьтесь с другим моим ответом, чтобы найти ссылку на объяснение того, как сохранить параметры подкоманды в setup.cfg; вы можете добавлять разделы для любой подкоманды, не только bdist_wheel. Что касается самих опций, то здесь становится сложно - единственный известный мне способ проверить их - это python setup.py bdist_wheel --help :-( По этому вопросу также отсутствуют соответствующие документы. Рад, что смог помочь! Добавлю правильный ответ завтра.   -  person hoefling    schedule 23.01.2021
comment
Вы также можете добавить соответствующий классификатор сокровищ: Programming Language :: Python :: Implementation :: CPython. На самом деле это не имеет значения, но, может быть, кто-то полагается на эти классификаторы.   -  person sinoroc    schedule 23.01.2021


Ответы (1)


К сожалению, вы не можете ограничить реализацию с помощью маркеров среды, а метаданные пакета не определяют ни одного подходящего поля. Однако реализация может быть ограничена с помощью тега языковой реализации в метаданных колеса; формат тега определен в PEP 425. Реализация CPython сокращена до cp, python_requires = >=3 из вашей конфигурации подразумевает cp3 для полного тега. Установите тег в разделе [bdist_wheel] в setup.cfg:

[metadata]
...

[options]
...

[bdist_wheel]
python_tag=cp3

Это не специально для bdist_wheel; любая подкоманда distutils может иметь раздел в setup.cfg, где можно сохранить параметры командной строки. Прочитайте Написание файла конфигурации установки, чтобы узнать об этом подробнее.

Чтобы ответить на ваш вопрос из комментариев:

Честно говоря, я даже не нашел онлайн-документацию по команде python-tag. Я что-то упускаю?

Это действительно несколько скрыто; документы wheel не содержат ссылок на параметры bdist_wheel. Обычно вы перечисляете их с помощью python setup.py bdist_wheel --help (как и с любой другой подкомандой), но, поскольку у вас нет сценария установки, вы можете подделать его:

$ python -c "from setuptools import setup; setup()" bdist_wheel --help
Options for 'bdist_wheel' command:
  ...
  --python-tag      Python implementation compatibility tag (default: 'py3')

Созданный файл колеса теперь будет иметь суффикс cp3-none-any (и тег cp3-none-any в метаданных колеса) и будет отклонен другими реализациями:

$ pypy3 -m pip install meowpkg-0.0.1-cp3-none-any.whl 
ERROR: meowpkg-0.0.1-cp3-none-any.whl is not a supported wheel on this platform.

Это также будет работать с исходными дистрибутивами, поскольку pip всегда будет создавать колесо из sdist, совместимых с PEP 517 (и не прибегать к устаревшему setup.py install), так что это также безопасно использовать с исходными дистрибутивами. Пример:

$ python -m build
$ pip uninstall -y wheel  # for testing only
WARNING: Skipping wheel as it is not installed.
$ pip install dist/meowpkg-0.0.1.tar.gz 
Processing ./dist/meowpkg-0.0.1.tar.gz
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... done
Building wheels for collected packages: meowpkg
  Building wheel for meowpkg (PEP 517) ... done
  Created wheel for meowpkg: filename=meowpkg-0.0.1-cp3-none-any.whl size=1005 sha256=d87571afcdeda6be74a182b9e3e1ce6035a4aea4bb173c291900a85e53232983
  Stored in directory: /home/oleg.hoefling/.cache/pip/wheels/1a/8c/43/90d6b484adcf2515d25503b0c47f14565cadf0e891a597e23e
Successfully built meowpkg
Installing collected packages: meowpkg
  Attempting uninstall: meowpkg
    Found existing installation: meowpkg 0.0.1
    Uninstalling meowpkg-0.0.1:
      Successfully uninstalled meowpkg-0.0.1
Successfully installed meowpkg-0.0.1
person hoefling    schedule 23.01.2021