Конфигурирование дополнительных модулей с distutils/setuptools

У меня есть проект Python с mutiple дополнительными модулями, записанными в C, которые говорят со сторонней библиотекой. Однако в зависимости от среды и опций пользователя некоторые модули не должны быть созданы, и некоторые флаги компилятора должны быть позволены/отключены. Проблема состоит в том, что я должен создать список дополнительных модулей, прежде чем я назову установку (), и идеально я хотел бы использовать distutils. Подкласс команды для обработки пользовательских опций. Прямо сейчас у меня есть несколько опций:

  1. Потребуйте, чтобы "Python setup.py настроил" команду быть выполненным прежде, чем создать модули, хранить информацию в файле рассола и использовать, это для генерации расширений перечисляет в следующий раз выполнения сценария. Это - то, как мой проект в настоящее время работает, который кажется довольно глупым.

  2. Вручную очистите опции из sys.argv и используйте их для создания списка. Это не долгосрочное решение, потому что я в конечном счете захочу запустить некоторые скрипты для проверки настроек перед зданием.

  3. Разделите build_ext на подклассы от distutils, реализуйте мою конфигурацию в начале выполнения () метод (возможно также использующий опции, отправленные через (2)), и непосредственно измените сам distribution.ext_modules перед зданием. Я боюсь, что это может перепутать setuptools, однако, поскольку он может предположить, что список дополнительных модулей исправлен, когда установку () называют. Это также означает, что, когда установку () называют с командой кроме build_ext, список дополнительных модулей пуст.

Существует ли предпочтительный способ сделать это?

6
задан 18 December 2009 в 21:56
поделиться

3 ответа

Я бы создал подкласс distutils.core.Distribution и передал его с помощью distutils.core.setup (distclass = CustomDistribution) - это дает вам доступ к параметры командной строки так же, как и в обычной установке, и вы можете делать такие вещи, как корректировка списка расширений в методе CustomDistribution .__ init __ . Но я согласен с dalke, путь distutils полон боли ...

0
ответ дан 17 December 2019 в 22:13
поделиться

Мой собственный опыт изменения distutils был слабым и шатким, поэтому все, что я могу предложить, - это указатели. Взгляните на numpy. У него есть целый подмодуль (numpy.distutils) со способами работы (или обхода) distutils. В противном случае обратитесь в список рассылки distutils.

0
ответ дан 17 December 2019 в 22:13
поделиться

Есть ли какой-либо предпочтительный способ сделать это?

Исходя из моего опыта работы с модулями других людей, я могу сказать, что, безусловно, нет единого мнения по поводу правых способ сделать это.

Я пробовал и отвергал подклассы distutils - я нашел его хрупким и трудным для работы с разными версиями Python и разными системами.

Что касается нашего кода, после того, как я опробовал те типы вещей, которые вы рассматриваете, я решил выполнять обнаружение и настройку прямо в setup.py перед основным вызовом setup () . По общему признанию, это немного уродливо, но это означает, что кто-то, пытающийся скомпилировать ваш материал, может найти одно место, например почему путь включения неверен. (И им, конечно, не нужно быть экспертами по внутреннему устройству distutils).

1
ответ дан 17 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: