Я хочу использовать git, чтобы иметь возможность работать над несколькими функциями в модуле, который я пишу одновременно. В настоящее время я использую SVN только с одним рабочим пространством, поэтому у меня есть только рабочее пространство на моем PYTHONPATH. Я понимаю, что это далеко не идеально, поэтому мне было интересно, может ли кто-нибудь предложить более «правильный» способ сделать это.
Позвольте мне уточнить гипотетическую ситуацию: Я говорю, что у меня есть модуль "яйца" с подмодулями "foo" и "bar". Компоненты в 'bar' используют код из foo, поэтому яйца / bar / a.py могут 'импортировать egg.foo'.
Скажем, «яйца» находятся в репозитории git. Я хочу опробовать некоторые изменения в 'foo', поэтому копирую его. Проблема в том, что 'import egg.foo' в egg / bar находит исходный репозиторий в PYTHONPATH, поэтому в конечном итоге он использует старый 'foo' вместо моего модифицированного.
Как мне настроить себя так, чтобы каждая копия модуля использовала свой собственный связанный с ним 'foo'? Спасибо.
edit - Спасибо за указатель на относительный импорт. Я прочитал об этом и вижу, как его применять. Одна проблема, с которой я столкнулся с его использованием, заключается в том, что я создал довольно большую кодовую базу, и я не был слишком аккуратен в этом, поэтому большинство модулей имеют быстрое `` самотестирование '' под if __name__ == '__main__':
, что из того, что я ' ve read не играет с относительным импортом:
http://mail.python.org/pipermail/python-list/2006-October/408945.html
http://www.velocityreviews.com/forums/t502905-relative-import-broken.html
Другое решение, которое я смог использовать в Google, - это преднамеренное манипулирование sys.path, что кажется еще худшим взломом. Есть ли другие возможности?
редактировать - Спасибо за предложения. Первоначально я неправильно понял ветки git, поэтому указанные ветки - это именно то, что я хочу. Тем не менее, я раньше не слышал об относительном импорте, так что спасибо и за это. Я узнал кое-что новое и, возможно, включу его использование.
Относительный импорт (PEP 328) может помочь:
eggs/
__init__.py
foo.py
bar.py
# foo.py
from __future__ import absolute_import
from . import bar
Другие варианты см. В Как вы организуете модули Python?.
Обновлено:
Еще один вариант - использовать предложения С.Лотта и Джима, то есть реструктурировать ваш пакет, чтобы исключить часть eggs.foo
, используемую eggs.bar.a
, и использовать git
для работы в экспериментальных ветвях (см. Книга сообщества Git).
Вот пример:
$ git status
# On branch master
nothing to commit (working directory clean)
[просто чтобы убедиться, что все в порядке]
$ git checkout -b experimental
Switched to a new branch "experimental"
[работа над экспериментальным материалом]
$ git commit -a
[перейти в экспериментальную ветку]
$ git checkout master
Switched to branch "master"
[работа над основной веткой]
$ git commit -a
Чтобы объединить изменения в основную ветку:
$ git merge experimental
См. Главу Базовое ветвление и слияние из вышеприведенной книги.
Спасибо за это. Я задал еще один связанный с этим вопрос, будьте любезны взглянуть: stackoverflow.com/questions/345746/…
«скажем, у меня есть модуль« яйца »с подмодулями« foo »и« bar ». Компоненты в« bar »используют код из foo, поэтому яйца / bar / a.py могут« импортировать egg.foo ».
Возможно, это не лучшая структура. Я предлагаю, чтобы у вас были другие модули, которые изо всех сил пытаются выбраться.
У вас есть eggs.bar.a
в зависимости от eggs.foo
. Я предполагаю, что другие вещи на eggs
зависят от eggs.foo
. Кроме того, я подозреваю, что eggs.foo
можно разделить на eggs.foo
и eggs.quux
, и все может быть проще.
Я бы рекомендовал провести рефакторинг, чтобы получить лучшую структуру. Проблемы PYTHONPATH
являются симптомом слишком большого количества вещей в неправильных местах в дереве модулей.
Однако преобразование общего кода в egg.quux не решает проблемы. Если я работаю над двумя копиями модуля, даже если я помещаю обе в PYTHONPATH, одна всегда будет первой, поэтому второй egg.bar.a по-прежнему эффективно использует первый файл egg.quux.
Дело в том, чтобы избежать двух копий общего модуля. Один экземпляр, отделенный от всего остального.
Возможно, я не правильно понимаю, но кажется, что git будет быть решением здесь, поскольку ветки git не нуждаются в отдельных путях.
Создайте ветку для каждой рабочей версии вашего модуля яиц. Затем, когда вы проверяете эту ветку, весь модуль изменяется до состояния, соответствующего версии вашего подмодуля. Затем вы можете объединить то, что вам нужно, между ветвями.
И, как заметил С.Лотт, возможно, небольшой рефакторинг тоже не повредит;)
Я новичок в git, поэтому не уверен, что понимаю, что вы предлагаете. Проблема в том, что если у меня проверены две ветки, подмодули из первой всегда будут найдены первыми. У вас есть способ обойти это? Я посмотрю на рефакторинг этого.
Моя неопытность с git показывает. Я разветвлялся, просто копируя репозиторий, но вы действительно правы. Ветви Git делают именно то, что я хочу.
Взгляните на связанные вопросы (справа).