Организация проектов Python с помощью общих пакетов

Как лучше всего организовать и разработать проект, состоящий из множества небольших скриптов, использующих одну (или несколько) более крупных библиотек Python?

В нашем репозитории есть несколько программ, которые используют одни и те же библиотеки, хранящиеся в одном репозитории. Другими словами, макет вроде

trunk
    libs
        python
        utilities
    projects
        projA
        projB

Когда официальные запуски наших программ будут завершены, мы хотим записать, какая версия кода использовалась. Для наших исполняемых файлов C ++ все просто, потому что, пока рабочая копия чиста во время компиляции, все в порядке. (А поскольку номер версии мы получаем программно, это должна быть рабочая копия, а не экспорт.) Для скриптов Python все сложнее.

Проблема в том, что часто будет запущен один проект (например, projA), и projB необходимо будет обновить. Это может привести к тому, что ревизия рабочей копии будет выглядеть смешанной для projA во время выполнения. (Для выполнения кода требуются часы, и его можно использовать в качестве входных данных для процессов, выполнение которых занимает несколько дней, отсюда и сильная цель отслеживания.)

Мой текущий обходной путь - при необходимости проверить еще одну копию ствола в другом месте и убежать оттуда. Но тогда мне нужно не забыть изменить свой PYTHONPATH, чтобы он указывал на вторую версию lib / python, а не на ту, что находится в первом дереве.

Вряд ли будет идеальный ответ. Но должен быть способ получше.

Должны ли мы использовать ключевые слова Subversion для хранения номера версии, что позволит пользователю данных экспортировать файлы? Должны ли мы использовать virtualenv? Следует ли нам больше подходить к механизму упаковки и установки? Setuptools является стандартом, но я читал о нем разные вещи, и, похоже, он предназначен для конечных пользователей, не являющихся разработчиками (которых у нас нет).


person AFoglia    schedule 07.11.2009    source источник
comment
Вы хотите сказать, что изменяете свои производственные библиотеки, пока их использует живой код?   -  person Peter Rowell    schedule 07.11.2009
comment
Я говорю, что это возможно. И что-то подобное произошло, когда я проводил официальный запуск программ. Я не менял код в рабочей копии, используемой в настоящее время, но svn этого не знал, поэтому сказал, что это смешанный репозиторий. И моя пробежка вызвала исключение, как и должно быть. Поскольку большинство людей в проекте не заботятся об использовании чистых копий, я хочу сделать такие возможности как можно более маловероятными.   -  person AFoglia    schedule 08.11.2009


Ответы (2)


Намного лучшее решение предполагает не хранить все ваши проекты и их общие зависимости в одном репозитории.

Используйте один репозиторий для каждого проекта и внешние для общих библиотек.

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

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

person Ben James    schedule 07.11.2009
comment
Я согласен и хотел использовать их уже больше года, но, похоже, никто другой не настаивает на их использовании. У нас есть несколько программистов, у которых проблемы с svn cp; svn externals будет для них слишком сложным. Кроме того, никто из пользователей не очень хорошо разбирается в нашей системе сборки и не знает, как ее настроить. Но, что наиболее важно, это не решает проблему простого управления тем, где Python будет смотреть на время выполнения. - person AFoglia; 08.11.2009
comment
AFoglia, возможно, вы можете использовать virtualenv для создания отдельной среды выполнения для каждого проекта. - person Ben James; 08.11.2009
comment
Я играл с virtualenv и думаю, что он будет делать то, что я хочу. Сначала мне нужно выяснить, как использовать setuptools для простой установки пакетов, но это уже вопрос для другого. - person AFoglia; 10.11.2009
comment
@AFoglia, вы, вероятно, уже знаете о 'pip' ... если у вас есть setup.py для любого из этих 'общих' пакетов, создайте файл virtualenv, файл requirements.txt и тому подобное. pip install -e / some / path обычно делает правильные вещи. - person Gregg Lind; 29.09.2011

Если я правильно понимаю ваш вопрос, то вам определенно нужен virtualenv. Добавьте немного доброты virtualenvwrapper, чтобы сделать его намного лучше.

person Jay P.    schedule 07.11.2009