Я пишу библиотеку , которая зависит от 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.