fabric:在helper函数中处理cd()

时间:2013-07-06 18:09:04

标签: python fabric contextmanager

在结构中,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")现在从bar/foo而不是foo运行。

有关如何解决此问题的任何提示?我尝试在cd中使用绝对路径,但这不起作用。我真正想要的是cd上下文只扩展到函数范围。

1 个答案:

答案 0 :(得分:0)

显然绝对路径工作。问题是~的路径不起作用(它们被视为相对路径,IMHO是结构中的错误),这就是我正在尝试的。所以你必须做(例如,如果你使用流浪汉)cd('/home/vagrant/foo')

可能你可以逃脱嵌套上下文管理器中的相对路径

def func():
    with cd("/home/vagrant/foo"):
        stuff()
        with cd("bar"): # cd /home/vagrant/foo/bar
            more_stuff()

因为您在调用cd('bar')时确切知道当前工作目录是什么。但是对于顶级cd,如果可以从另一个函数(不仅仅是直接来自fab)调用该函数,则应该使用绝对路径。