Требовать BeautifulSoup в пакете Python - что нужно в setup.py? - PullRequest
3 голосов
/ 23 сентября 2011

Я пишу сценарий установки для дистрибутива Python, foo. Мой код требует BeautifulSoup, поэтому в настоящее время мой каталог структурирован так:

<root>/
        setup.py
        __init__.py
        foo.py
        BeautifulSoup/
            __init__.py
            BeautifulSoup.py
            etc.

И setup.py в настоящее время выглядит так (меньше метаинформации):

setup(name='foo',
      version='0.9.0',
      py_modules=['foo']
      )

Я хочу включить BeautifulSoup на случай, если у пользователя его еще не установили, но я также не хочу его устанавливать, если он уже установлен в определенной версии. В документах Python 2.7.2 я заметил, что я должен включить packages=[...] в мой файл setup.py.

Однако Раздел 2.4. Отношения между дистрибутивами и пакетами упоминает, что есть способ указать, что требуется конкретная версия пакета. Я не смог найти примеров того, как использовать «требует выражения» в setup.py, поэтому я не уверен, что это то, что мне нужно.

Короче, мне нужен способ сказать:

Для этого пакета требуется BeautifulSoup, по крайней мере, с версией X.X.X. Если эта версия не установлена, используйте предоставленную версию.

Как мне это сделать?

1 Ответ

4 голосов
/ 23 сентября 2011

Структура каталогов:

<root>/
        setup.py
        foo.py

Примечание: файла __init__.py нет.

Вы можете использовать distribute для указания зависимостей, setup.py:

from setuptools import setup

setup(name='foo',
      version='0.9.0',
      py_modules=['foo'],
      install_requires=['BeautifulSoup >= X.X.X'],
)

Будет установлена ​​необходимая версия BeautifulSoup, если она еще не установлена.Вам не нужно указывать BeautifulSoup в этом случае.

Если вы не хотите устанавливать BeautifulSoup автоматически:

<root>/
        setup.py
        foobar/
            __init__.py
            foo.py
            BeautifulSoup/
                __init__.py
                BeautifulSoup.py
                etc.

setup.py:

from setuptools import setup, find_packages

setup(name='foobar',
      version='0.9.0',
      packages=find_packages(),
) #NOTE: no install_requires

Где-то в ваших модулях:

import pkg_resources
try:
    pkg_resources.require("BeautifulSoup>=X.X.X")
except pkg_resources.ResolutionError:
    from foobar import BeautifulSoup
else:
    import BeautifulSoup

Это менее желательный и необычный метод.

...