Как мне работать с несколькими ветвями git модуля Python?

Я хочу использовать 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 не играет с относительным импортом:

Другое решение, которое я смог использовать в Google, - это преднамеренное манипулирование sys.path, что кажется еще худшим взломом. Есть ли другие возможности?

редактировать - Спасибо за предложения. Первоначально я неправильно понял ветки git, поэтому указанные ветки - это именно то, что я хочу. Тем не менее, я раньше не слышал об относительном импорте, так что спасибо и за это. Я узнал кое-что новое и, возможно, включу его использование.

Взгляните на связанные вопросы (справа).

jfs 05.12.2008 15:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
1 714
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Относительный импорт (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/…

saffsd 06.12.2008 04:58

«скажем, у меня есть модуль« яйца »с подмодулями« 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.

saffsd 06.12.2008 04:17

Дело в том, чтобы избежать двух копий общего модуля. Один экземпляр, отделенный от всего остального.

S.Lott 06.12.2008 17:37
Ответ принят как подходящий

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

Создайте ветку для каждой рабочей версии вашего модуля яиц. Затем, когда вы проверяете эту ветку, весь модуль изменяется до состояния, соответствующего версии вашего подмодуля. Затем вы можете объединить то, что вам нужно, между ветвями.

И, как заметил С.Лотт, возможно, небольшой рефакторинг тоже не повредит;)

Я новичок в git, поэтому не уверен, что понимаю, что вы предлагаете. Проблема в том, что если у меня проверены две ветки, подмодули из первой всегда будут найдены первыми. У вас есть способ обойти это? Я посмотрю на рефакторинг этого.

saffsd 06.12.2008 04:13

Моя неопытность с git показывает. Я разветвлялся, просто копируя репозиторий, но вы действительно правы. Ветви Git делают именно то, что я хочу.

saffsd 06.12.2008 05:45

Другие вопросы по теме