Условные требования в setup.py - PullRequest
0 голосов
/ 11 февраля 2019

Я пишу библиотеку , которая зависит от file-magic , которая прекрасно работает для большинства платформ, но в Alpine Linux, file-magicне будет работать, поэтому мне нужно вместо этого использовать библиотеку python-magic .

Теперь я знаю, как написать свой собственный код для обработки различных API-интерфейсов библиотеки Python, но что я не делаю?Не знаю, как это сделать, - написать мои setup.cfg или setup.py, чтобы иметь другие требования в зависимости от системы, на которой мы выполняем установку.

Я подумал, что лучшим вариантом будет использование PEP 508 правил, но я не могу понять, как сказать "libmagic like Alpine" или что-то в этом синтаксисе, не говоря уже о том, будет ли это работать в пакете setup.py.На самом деле, я даже не могу понять, как определить разницу между архитектурами, не устанавливая file-magic и не наблюдая, как он умирает: - (

Конечно, для такого рода вещей должен быть лучший метод?

Обновление

После более широкого понимания Тима ниже, я собрал этот хак, чтобы он заработал:

def get_requirements():
    """
    Alpine is problematic in how it doesn't play nice with file-magic -- a
    module that appears to be the standard for most other Linux distros.  As a
    work-around for this, we swap out file-magic for python-magic in the Alpine
    case.
    """

    config = configparser.ConfigParser()
    config.read("setup.cfg")
    requirements = config["options"]["install_requires"].split()

    os_id = None
    try:
        with open("/etc/os-release") as f:
            os_id = [_ for _ in f.readlines() if _.startswith("ID=")][0] \
                .strip() \
                .replace("ID=", "")
    except (FileNotFoundError, OSError, IndexError):
        pass

    if os_id == "alpine":
        requirements[1] = "python-magic>=0.4.15"

    return requirements


setuptools.setup(install_requires=get_requirements())

Это позволяет использовать декларативный синтаксис setup.cfg,но настраивает значение install_requires, если целью установки является система Alpine.

1 Ответ

0 голосов
/ 11 февраля 2019

Возможно, вы захотите использовать модуль платформы , чтобы попытаться определить детали системы.

Лучше всего попробовать использовать комбинацию platform.architecture(), platform.platform() иplatform.system() с правильной обработкой ошибок и рассмотрением всей возможной информации о возвращении.

Пример:

Я работаю на Win10, вот выходные данные этих функций (иеще один):

>>> import platform
>>> print(platform.architecture())
('32bit', 'WindowsPE')
>>> print(platform.platform())
Windows-10-10.0.17134-SP0
>>> print(platform.processor())
Intel64 Family 6 Model 142 Stepping 10, GenuineIntel
>>> print(platform.system())
Windows

Редактировать

Приведенный выше ответ не обязательно возвращает требуемую информацию (я не упомянул о любых устаревших функциях из модуля платформы).

Копание немного глубже, дает этот результат SO , который объясняет, что встроенные функции платформы для сбора имен дистрибутивов устарели.

Официальные документы указывают в направлении PyPiПакет называется дистрибутив .В дистрибутивах PyPi признается необходимость в информации такого типа, и пример использования, найденный там, выглядит следующим образом:

>>> import distro
>>> distro.linux_distribution(full_distribution_name=False)
('centos', '7.1.1503', 'Core')
...