Подтвердить что ты не робот

Можно ли выразить зависимую от платформы зависимость в setup.py, не создавая версии моего яйца для конкретной платформы?

У нас есть ярлык-заполнитель, который не содержит кода и существует только для того, чтобы вытащить список зависимых пакетов из нашего репозитория PyPi.

Большинство этих зависимых пакетов являются агрегированными для платформы, однако некоторые из них используются только на платформах Win32.

Можно ли каким-либо образом сделать зависимую платформу-условной, чтобы данная зависимость в моем install_requires списке была снижена только при установке на Win32?

Альтернативно: Можно ли указать список дополнительных зависимостей, который будет установлен, если он доступен, но не приведет к сбою easy_install, если они не являются?

4b9b3361

Ответ 1

Используйте параметр распространения extras_require, чтобы сделать "win32 support" дополнительной функцией:

setup(
  ...
  extras_require={
    'win32': 'pywin32'
  },
  ...
)

Затем укажите функцию win32 при установке в Windows:

easy_install mypackage[win32]

Это приведет к отключению пакета pywin32, который указан как зависимость для функции win32 mypackage.

Подробнее о дополнительных функциях см. здесь.

Ответ 2

В setup.py:

from setuptools import setup
import sys

setup(
    name="...",
    install_requires=["This", "That"] + (
        ["WinOnly", "AnotherWinOnly"] if sys.platform.startswith("win") else []
        )
)

distutils.util.get_platform имеет больше информации, чем sys.platform, если вам это нужно:

>>> sys.platform
'linux2'
>>> distutils.util.get_platform()
'linux-i686'

Ответ 3

см. fooobar.com/questions/431989/... для колес

и это для выхода sdist или egg из: http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies

Иногда проекту может потребоваться зависимость для работы на определенной платформе. Это может привести к пакету, который возвращает порты модуля, чтобы он мог использоваться в более старых версиях python. Или это может быть пакет, который требуется для работы в конкретной операционной системе. Это позволит проекту работать на нескольких разных платформах без установки зависимостей, которые не требуются для платформы, которая устанавливает проект.

setup(
    name="Project",
    ...
    install_requires=[
        'enum34;python_version<"3.4"',
        'pywin32 >= 1.0;platform_system=="Windows"'
    ]
)

Ответ 4

Когда яйцо построено (используя python setup.py bdist_egg), вы можете принудительно настроить setuptools/distribute для создания определенного для платформы яйца.

from setuptools import setup
import os

# Monkey-patch Distribution so it always claims to be platform-specific.
from distutils.core import Distribution
Distribution.has_ext_modules = lambda *args, **kwargs: True

requirements = ['generic-foo', 'generic-bar']

if os.getenv('WINDOWS_BUILD'):
    requirements.extend(['a-windows-only-requirement'])

setup(
    name="...",
    install_requires=requirements
)

Вы можете просто сделать:

# Force a windows build
$ WINDOWS_BUILD=y python setup.py bdist_egg -p win32
# Do a linux build -- you may not need to specify -p if you're happy
# with your current linux architecture.
$ python setup.py bdist_egg -p linux-i686