2016-07-11 3 views
2

Некоторые пакеты Python требуют одного из двух пакетов в качестве зависимости. Например, Ghost.py требует либо PySide, либо PyQt4.Требуется только одна из двух зависимостей в файле требований

Можно ли включить такую ​​зависимость в файл requirements.txt? Есть ли какой-либо оператор «или», который работает с этими файлами?

Если нет, что я могу сделать, чтобы добавить эти требования к файлу, чтобы только один из них был установлен?

ответ

2

В настоящее время ни один из пунктов requirement.txt, ни setuptools не допускают такую ​​конструкцию. Оба требуют от вас указать список требований. Вы можете ограничить версию требования, но это все.

Внутри Python, вы можете справиться с этой ситуацией следующим образом:

try: 
    import dependency1 

    def do_it(x): 
     return dependency1.some_function(x) 
except ImportError: 
    try: 
     import dependency2 

     def do_it(x) 
      return dependency2.another_function(x) 
    except ImportError: 
     raise ImportError('You must install either dependency1 or ' 
          + 'dependecy2!') 

Теперь do_it использует либо dependency1.some_function или dependency2.another_function, в зависимости от того, который доступен.

Это все равно оставит вас с проблемой определения ваших требований. Я вижу два варианта:

  1. Не формально определяют требования в requirements.txt или setup.py, но документ о том, что пользователю необходимо установить один из зависимостей. Этот подход может быть в порядке, если для настройки вашего программного обеспечения в любом случае требуются дополнительные шаги управления (то есть больше, чем только pip install my_tool).
  2. Жесткий код вашего предпочтительного требования в requirements.txt или setup.py.

В конце концов, вы должны спросить себя, почему люди могут захотеть использовать одну зависимость по сравнению с другой: мне обычно нечего заботиться о зависимостях библиотек, которые я использую, потому что (дисковое) пространство дешево и (из-за virtualenv), существует небольшой риск несовместимости. Поэтому я бы даже предложил вам подумать о том, чтобы не поддерживать две разные зависимости для одной и той же функциональности.

1

Я хотел бы использовать небольшой скрипт на Python для достижения этой цели

#!/usr/bin/env python 
packages = 'p1 p2 p3'.split() 

try: 
    import optional1 
except ImportError: # opt1 not installed 
    try: 
     import optional2 
    except ImportError: # opt2 not installed 
     packages.append('optional2') 

print(' '.join(packages)) 

Есть скрипт исполняемым с

chmod +x requirements.py 

И, наконец, запустить пип с ним, как это:

pip install $(requirements.py) 

'$ (requirements.py)' выполнит скрипт requirements.py и поместит его вывод (в этом случае список pac kages) в pip install ...

+0

Интересно. Я не знал, что вы можете использовать такой синтаксис с 'pip'. –