Python "setup.py develop": возможно ли создать папку ".egg-info" не в папке с исходным кодом?

Python имеет возможность "pseudoinstall" пакета, запустив setup.py script с помощью develop вместо install. Это изменяет среду python, поэтому пакет может быть импортирован из текущего местоположения (он не скопирован в каталог site-package). Это позволяет разрабатывать пакеты, которые используются другими пакетами: исходный код изменен на месте, а изменения доступны для остальной части кода python с помощью простого import.

Все работает отлично, за исключением того, что команда setup.py develop создает папку .egg-info с метаданными на уровне setup.py. Смешивание исходного кода и временных файлов - не очень хорошая идея - эту папку нужно добавить в "игнорировать" списки нескольких инструментов, начиная с vcs и заканчивая системами резервного копирования.

Можно ли использовать setup.py develop, но создать каталог .egg-info в другом месте, поэтому исходный исходный код не загрязнен временным каталогом и файлами?

Ответы

Ответ 1

setup.py develop создает яйцо питона, на месте; он не [изменить] среду python, поэтому пакет может быть импортирован из текущего местоположения. Вам все равно придется либо добавить его в путь поиска python, либо использовать каталог, в который он помещен, в качестве текущего каталога.

Это команда develop для создания яйца на месте, которое может включать компиляцию C-расширений, выполнение процесса преобразования python 2to3 для создания совместимого с Python кода, а для предоставления метаданных другой код python может полагаться на. Когда вы устанавливаете пакет в виде яйца в каталог site-packages, туда же включаются те же метаданные. Данные, конечно, не временные (он извлекается из вашего файла setup.py для легкого анализа другими инструментами).

Цель состоит в том, чтобы затем вы могли полагаться на эти метаданные при использовании своего пакета в более широкой системе, которая опирается на присутствующие метаданные, при этом все еще разрабатывая пакет. Например, в развертывании разработки buildout мы часто используем mr.developer, чтобы автоматизировать процесс извлечения исходного кода для данного пакета, когда мы должны работать над ним, который строит его как разрабатываемое яйцо и связывает его с развертыванием, пока мы работаем над кодом.

Обратите внимание, что каталог .egg-info служит для определенной цели: сигнализировать другим инструментам в eco-системе setuptools, что ваш пакет установлен и доступен. Если ваш пакет является зависимым от другого яйца в вашей настройке, то эта зависимость выполняется. pip и easy_install, и сборка не будет пытаться извлечь яйцо из другого места.

Помимо создания каталога .egg-info, единственной вещью, которую выполняет команда, является создание расширений на месте. Итак, команда, которую вы ищете, это:

setup.py build_ext --inplace

Это будет делать то же самое, что и setup.py develop, но не укажет каталог .egg-info. Он также не будет генерировать файл .pth.

Невозможно создать только файл .pth и оставить без генерации каталога .egg-info.

С технической точки зрения, setup.py develop также проверяет, установлен ли файл setuptools site.py для поддержки пакетов с расширением имен, но это не имеет значения.

Ответ 2

Хорошим способом является сохранение всех исходных файлов в специальном каталоге, имя которого является вашим именем проекта (программисты, использующие другие языки, сохраняют свой код внутри каталога src). Поэтому, если ваш файл setup.py находится внутри каталога myproject, вы должны хранить файлы в myproject/myproject. Этот метод сохраняет ваши источники отдельно от других файлов, независимо от того, что происходит в основной директории.

Мое предложение было бы использовать белый список вместо черного списка - сообщите инструментам игнорировать все файлы, за исключением тех, которые находятся внутри каталога myproject. Я думаю, что это самый простой способ не слишком часто касаться ваших списков ignore.

Ответ 3

Попробуйте параметр --install-dir. Вы также можете использовать --build-dir для изменения строительного каталога.