У меня есть проект Python с mutiple дополнительными модулями, записанными в C, которые говорят со сторонней библиотекой. Однако в зависимости от среды и опций пользователя некоторые модули не должны быть созданы, и некоторые флаги компилятора должны быть позволены/отключены. Проблема состоит в том, что я должен создать список дополнительных модулей, прежде чем я назову установку (), и идеально я хотел бы использовать distutils. Подкласс команды для обработки пользовательских опций. Прямо сейчас у меня есть несколько опций:
Потребуйте, чтобы "Python setup.py настроил" команду быть выполненным прежде, чем создать модули, хранить информацию в файле рассола и использовать, это для генерации расширений перечисляет в следующий раз выполнения сценария. Это - то, как мой проект в настоящее время работает, который кажется довольно глупым.
Вручную очистите опции из sys.argv и используйте их для создания списка. Это не долгосрочное решение, потому что я в конечном счете захочу запустить некоторые скрипты для проверки настроек перед зданием.
Разделите build_ext на подклассы от distutils, реализуйте мою конфигурацию в начале выполнения () метод (возможно также использующий опции, отправленные через (2)), и непосредственно измените сам distribution.ext_modules перед зданием. Я боюсь, что это может перепутать setuptools, однако, поскольку он может предположить, что список дополнительных модулей исправлен, когда установку () называют. Это также означает, что, когда установку () называют с командой кроме build_ext, список дополнительных модулей пуст.
Существует ли предпочтительный способ сделать это?
Я бы создал подкласс distutils.core.Distribution
и передал его с помощью distutils.core.setup (distclass = CustomDistribution)
- это дает вам доступ к параметры командной строки так же, как и в обычной установке, и вы можете делать такие вещи, как корректировка списка расширений в методе CustomDistribution .__ init __
. Но я согласен с dalke, путь distutils полон боли ...
Мой собственный опыт изменения distutils был слабым и шатким, поэтому все, что я могу предложить, - это указатели. Взгляните на numpy. У него есть целый подмодуль (numpy.distutils) со способами работы (или обхода) distutils. В противном случае обратитесь в список рассылки distutils.
Есть ли какой-либо предпочтительный способ сделать это?
Исходя из моего опыта работы с модулями других людей, я могу сказать, что, безусловно, нет единого мнения по поводу правых способ сделать это.
Я пробовал и отвергал подклассы distutils - я нашел его хрупким и трудным для работы с разными версиями Python и разными системами.
Что касается нашего кода, после того, как я опробовал те типы вещей, которые вы рассматриваете, я решил выполнять обнаружение и настройку прямо в setup.py перед основным вызовом
setup ()
. По общему признанию, это немного уродливо, но это означает, что кто-то, пытающийся скомпилировать ваш материал, может найти одно место, например почему путь включения неверен. (И им, конечно, не нужно быть экспертами по внутреннему устройству distutils).