Можно ли выразить зависимую от платформы зависимость в setup.py без построения специфичных для платформы версий моего яйца? - PullRequest
17 голосов
/ 24 июня 2011

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

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

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

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

Ответы [ 4 ]

20 голосов
/ 22 марта 2017

Для выпуска sdist, egg и wheel из: 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"'
    ]
)
13 голосов
/ 24 июня 2011

В 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'
5 голосов
/ 24 июня 2011

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

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

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

easy_install mypackage[win32]

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

См. здесь для получения дополнительной информации о дополнительных функциях.

1 голос
/ 30 июля 2014

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

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
...