【问题标题】:How to set the working directory for a Fabric task?如何设置 Fabric 任务的工作目录?
【发布时间】:2012-05-04 02:10:26
【问题描述】:

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

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 完全陌生。

【问题讨论】:

  • 一定要看看tutorial,这个问题已经在里面了。

标签: python fabric


【解决方案1】:

使用Context Manager 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')

【讨论】:

  • 但是如果我想让我的 all 我的run 命令在同一目录中运行怎么办?我是否必须将整个 fabfile 包装在 with cd() 中?有没有类似env.working_dir = '/my/dir'的东西?
  • @Dotl 如果您不想在上下文管理器中包装一个大块,请将所有黑色放入一个单独的函数中,并将对该函数的调用包装到上下文管理器中。
  • 请注意,Context 对象现在包含在 Invoke
【解决方案2】:

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 documentation 涵盖了这一点。

【讨论】:

  • fabric 文档建议使用with Connection('host') as c:,那么您会将 with 语句嵌套在彼此内部吗? with Connection('host') as c: with c.cd('/tmp/'):
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2012-01-14
  • 2023-03-02
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多