Параметры добавления setup.py (он же setup.py --enable-feature) - PullRequest
3 голосов
/ 25 апреля 2010

Я ищу способ включить некоторые функции в модуль Python (расширение) на этапе установки.

На практике:

У меня есть библиотека Python, в которой есть 2 реализации одной и той же функции, одна внутренняя (медленная) и одна, которая зависит от внешней библиотеки (быстрая, на C).

Я хочу, чтобы эта библиотека была необязательной и ее можно было активировать во время компиляции / установки с помощью флажка:

python setup.py install # (it doesn't include the fast library)
python setup.py --enable-fast install

Я должен использовать Distutils, однако все решения хорошо приняты!

Ответы [ 2 ]

4 голосов
/ 25 апреля 2010

Документы для distutils включают раздел о расширении стандартной функциональности . Похоже, уместно предложить подклассы соответствующих классов из модулей distutils.command.* (таких как build_py или install) и сказать setup использовать ваши новые версии (через аргумент cmdclass, который является словарем отображение команд на классы, которые должны использоваться для их выполнения). Обратитесь к источнику любого из классов команд (например, команда установки ), чтобы получить хорошее представление о том, что нужно сделать, чтобы добавить новую опцию.

2 голосов
/ 26 апреля 2010

Примером именно того, что вы хотите, является sqlalchemy s cextensions , которые существуют специально для той же цели - более быстрой реализации Си Чтобы увидеть, как SA реализовал это, вам нужно взглянуть на 2 файла:

1) setup.py . Как видно из выписки ниже, они обрабатывают дела с setuptools и distutils:

try:
    from setuptools import setup, Extension, Feature
except ImportError:
    from distutils.core import setup, Extension
    Feature = None

Позже происходит проверка if Feature:, и расширение настраивается правильно для каждого случая с использованием переменной extra, которая позже добавляется к функции setup().

2) base.py : посмотрите, как определяется BaseRowProxy:

try:
    from sqlalchemy.cresultproxy import BaseRowProxy
except ImportError:
    class BaseRowProxy(object):
        #....

Таким образом, как правило, после установки расширений C (с использованием флага --with-cextensions во время установки) будет использоваться реализация C. В противном случае используется чистая Python-реализация класса / функции.

...