2010-01-07 6 views
2

В некоторых случаях существуют различные модули, которые каждый реализуют общий API (в моем случае, старый чистокровные питона elementtree, cElementTree, lxml.etree, и встроенный в xml.etree) , Я могу написать модуль, используя ElementTree, чтобы попробовать каждый из этих параметров и взять первый, который существует в соответствии с моим собственным порядком предпочтений, но я не могу найти никакой информации о том, что только один из них должен быть установлен в setup.py. Я хочу написать что-то, что выглядит примерно так:Setuptools «по крайней мере, один из этих» спецификации зависимостей

setup(
    ..., 
    install_requires=""" 
     elementtree | cElementTree | lxml 
    """, 
    ... 
) 

Возможно, это возможно или что-то в этом роде?

ответ

0

Я так не думаю, но если вы используете достаточно недавний Python, elementtree, являющийся частью стандартных библиотек Python, почему вы беспокоитесь, что он может отсутствовать? (Я понимаю, что это будет проблемой для других случаев нескольких возможных реализаций API, мне просто интересно, действительно ли это нужно для вашего конкретного случая использования).

+0

Эта проблема на самом деле происходит в стороннем модуле с открытым исходным кодом, который мы используем, поэтому я искал решение для внесения исправлений и хотел избежать появления публичного призрака разработчиков модуля. Наш другой код зависит от lxml и работает в Py26, поэтому у нас есть как минимум две другие версии - просто не те, которые называются 'elementtree'. – dcrosta

0

Вы можете попробовать сделать что-то подобное в setup.py:

install_requires = ["elementree"] 

try: 
    import cElementTree 
    install_requires = [] 
except ImportError: 
    try: 
     import lxml 
     install_requires = [] 
    except ImportError: 
     # etc for remaining equivalent modules 

setup(
    install_requires = install_requires, 
    # rest of setup parameters 
) 

Это будет в основном установить Elementree пакет как зависимость, если ни один из эквивалента не установлены.

+0

К сожалению, это не сработает - код развертывается через RPM, причем каждый сторонний модуль (см. Мой комментарий к сообщению Alex Martelli) построен и установлен в отдельном RPM. К тому времени, когда 'pkg_resources' проверяет зависимости при запуске, мы уже прошли, когда запускается' setup.py' (и на самом деле он даже не присутствует в системе, где происходит ошибка). – dcrosta

+0

Это не имеет смысла для меня. Если вы развертываете пакеты в качестве RPM, зачем вам запускать setup.py? –

+0

'setup.py' запускается во время сборки RPM и, помимо прочего, создает' .egg-info/require.txt', который называет «elementtree». Я считаю нужным место, чтобы изменить это в 'setup.py' для компонента с зависимостью, а также в модулях, которые пытаются импортировать' elementtree'. – dcrosta

Смежные вопросы