2010-04-25 3 views
3

Я ищу способ включить некоторую функцию в модуль python (extension) на этапе установки.Параметры настройки setup.py (aka setup.py --enable-feature)

В практическом образом:

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

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

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

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

+0

Большое спасибо за ваши ответы, каждый из которых заслуживает принятия ответа! – pygabriel

ответ

2

Примером именно того, что вы хотите, является sqlalchemy's cextensions, которые существуют специально для этой же цели - более быстрая реализация C. Чтобы увидеть, как 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.

4

Документы для distutils включают a section on extending the standard functionality. Соответствующее предложение похоже на подкласс соответствующих классов из модулей distutils.command.* (например, build_py или install) и сообщите setup для использования ваших новых версий (через аргумент cmdclass, который представляет собой команды сопоставления словарям для классов, которые должны использоваться для выполнить их). См. Источник любого из классов команд (например, the install command), чтобы получить представление о том, что нужно сделать, чтобы добавить новую опцию.