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

Rob*_*loi 23 python fabric

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

from fabric.api import run, env

env.use_ssh_config = True

def list_files():
    run('ls')
Run Code Online (Sandbox Code Playgroud)

我执行它:

fab -H server list_files
Run Code Online (Sandbox Code Playgroud)

如何为我正在运行的命令指定工作目录,而不是:

run('cd /tmp && ls')
Run Code Online (Sandbox Code Playgroud)

哪个对我来说不是很惯用?

免责声明:我在生活中第一次看到Fabric,而且我对Python完全不熟悉.

Dan*_*per 42

使用Context Managercd:

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')
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`Context` 对象现在包含在 [Invoke](http://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context.cd) 中 (2认同)

Bri*_*een 16

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')
Run Code Online (Sandbox Code Playgroud)

这不在fabric文档中,而是在invoke文档中