В Fabric менеджер контекста cd
работает как
with cd("dir"):
run("command")
и команда будет запущена после перехода в каталог dir
. Это прекрасно работает, но проблема в том, что используется глобальное состояние. Например, предположим, что у меня есть вспомогательная функция, которая должна использовать cd:
def helper():
with cd("foo"):
run("some command")
Если я вызову helper
из другой функции, например
def main_function():
helper()
...
это работает нормально. Но если я сделаю что-то вроде
def main_function():
with cd("bar"):
helper()
он ломается, потому что помощник run("come command")
from теперь запускается из bar/foo
, а не только из foo
.
Любые советы о том, как обойти это? Я пытался использовать абсолютные пути в компакт-диске, но это не сработало. Я действительно хочу, чтобы контекст cd
распространялся только на область действия функции.
cd
использует глобальное состояние, немного вводит в заблуждение. Он изменяет рабочий каталог, который в любом случае является глобальным состоянием, и неожиданноеcd
— это только один из нескольких способов, с помощью которых команды, полагающиеся на рабочий каталог, могут сломаться. Если вы хотите обойти это, используйте абсолютные пути. - person   schedule 06.07.2013~
. Предварительное тестирование показывает, что абсолютные пути действительно работают, если они действительно абсолютны. - person asmeurer   schedule 06.07.2013