2017-01-11 17 views
1

Я изучаю, как использовать distutils, и есть кое-что, что я не понимаю, и я хочу, чтобы кто-то мог объяснить это мне.Python 3: setup.py: pip install, который делает все (build_ext + install)

я уже преуспел в создании tar.gz пакетов, которые могут быть установлены с

pip install mypackage.tar.gz 

Я сделал это с setup.py, с простым скриптом, который запускает функцию setuptools.setup(), которую я называю, используя python3 setup.py sdist.

Что я хочу узнать сейчас: Как включить в него расширения здания.

Моя проблема: Я не мог найти какой-либо всеобъемлющий текст, который объясняет, как pip install пакета, который имеет build_ext класс может получить его построить, а затем установить.

Если мы посмотрим на this example, для известного инструмента cx_freeze пакета, мы видим:

  • Там в наследственное build_ext класса
  • Там в это метод build_extension()
  • в setup(), переменная cmdclass, которая содержит a dict, который содержит класс build_ext

Мой вопрос: Что получает cx_freeze, чтобы построить расширение, а затем установить его? Имеет ли значение cmdclass с build_ext для достижения этого?

ответ

1

После многих испытаний я узнал, что это связано с тем, как работает pip, а не как работает setup.py. Оказывается, что после написания файла setup.py и используя pip установить, это то, что происходит:

  1. пипа создает временный файл, в Linux это в /tmp, и на Windows, это в каталоге для временных файлов пользователя.
  2. пип загрузки/извлекает пакет на этот временный каталог запускается (то ли от tar.gz или из интернет-источника или из хранилища)
  3. пип следующие операции в следующем порядке:
    • setup.py install
    • setup.py build
    • setup.py install_lib
    • setup.py build_py
    • setup.py build_ext

И все это зависит от того, есть ли у вас вещи, определенные в параметре setup()cmdclass.Например, build_ext будет работать только в том случае, если у вас есть build_ext, определенный в cmdclass И у вас есть ext_modules, определенный в параметрах вашего звонка setup(). Таким образом, ожидается, что ext_modules будет списком Extension(), который содержит всю информацию о каждом расширении. Функция в классе build_extension(self,ext) будет выполнена для каждого элемента этого списка.

Все эти классы, которые идут в cmdclass (я использую build и build_py) есть метод, называемый run(), что вы должны переопределить, чтобы положить в процедуре заказ на строительство.

В конце концов это будет сделано, пип устанавливает (или копирует) packages определенных в setup() (которые в основном каталоги в этой температуре) в директорию на Python, который является концом установки, а также удаляет временные файлы.

Есть более подробная информация обо всем этом, но я думаю, это хорошо для стартера. Я не видел, чтобы ничто из этого не объяснялось нигде всесторонне. Поэтому я надеюсь, что это поможет и избавит людей от эмпирического тестирования, которое я должен был сделать, чтобы узнать это.