如何为Fabric任务设置工作目录?

28

假设我定义了一个简单的任务,用于列出远程服务器上的文件:

from fabric.api import run, env

env.use_ssh_config = True

def list_files():
    run('ls')

我使用以下命令来执行它:

fab -H server list_files

除了使用以下命令,我如何指定正在运行的命令的工作目录:

run('cd /tmp && ls')

这对我来说看起来不太符合惯用语?

声明:我是第一次接触 Fabric,并且对 Python 完全是新手。


1
请务必查看tutorial,这个问题在其中有涉及到。 - Morgan
2个回答

49

使用上下文管理器cd

from fabric.api import run, env
from fabric.context_managers import cd

env.use_ssh_config = True

def list_files():
    with cd('/tmp'):
        run('ls')

1
但是如果我希望所有run命令都在同一个目录下运行怎么办?我需要用with cd()包装整个fabfile吗?难道没有类似于env.working_dir = '/my/dir'的东西吗? - Dotl
如果您不想在上下文管理器中包含一个巨大的块,可以将所有代码放入单独的函数中,并将对该函数的调用放入上下文管理器中。 - warvariuc
2
请注意,Context对象现在包含在Invoke中。 - Juddling

23

fabric 2.4.0的答案如下:

from fabric import Connection

conn = Connection(host=HOST_NAME, user=USER_NAME, connect_kwargs={'password': PASSWORD})

with conn.cd('/tmp/'):
    conn.run('ls -la')

这并不在fabric文档中提到,而是在invoke文档中提到。


Fabric文档建议使用with Connection('host') as c:,那么您会将with语句嵌套在彼此内部吗? with Connection('host') as c: with c.cd('/tmp/'): - Colin B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接