【问题标题】:Weird issues when interpolating string output of fabric command插入结构命令的字符串输出时出现奇怪的问题
【发布时间】:2013-10-11 04:37:39
【问题描述】:

无法理解如何做一些我认为应该使用 Fabric 直观的操作。我想捕获远程执行命令产生的标准输出,然后在后续远程调用中使用结果。

但是,我遇到了非常难以理解的错误。我感觉到我正在做的事情有很多问题,但我不知道从哪里开始。也许有人可以帮我打破这个。

我有什么:

...
with cd(env.repo):
    abbrev_hash = run('git log -1 --pretty="%h"')
run("rsync -r --exclude '.git/*' %s %s" % (env.repo, abbrev_hash))
... 

相关输出:

[cookcountyjail.recoveredfactory.net] 运行:git log -1 --pretty="%h" [cookcountyjail.recoveredfactory.net] 出: [cookcountyjail.recoveredfactory.net] 出:c6d4ea0 [cookcountyjail.recoveredfactory.net] 出: [cookcountyjail.recoveredfactory.net] 出: [cookcountyjail.recoveredfactory.net] 运行:rsync -r --exclude '.git/*' > /home/ubuntu/repos/cookcoc6d4ea0l_2.0-dev

[cookcountyjail.recoveredfactory.net] out: /bin/bash: -c: line 1: 意外标记附近的语法错误newline' [cookcountyjail.recoveredfactory.net] out: /bin/bash: -c: line 1: [cookcountyjail.recoveredfactory.net] 出:' [cookcountyjail.recoveredfactory.net] 出:

致命错误:run() 在执行时收到非零返回码 1!

c6d4ea0ed: rsync -r --exclude '.git/*' /home/ubuntu/repos/cookcountyjail_2.0-dev

执行:/bin/bash -l -c "cd /home/ubuntu/website/2.0/websites && export PATH=\"\$PATH:\"/home/ubuntu/website/2.0/websites/active\ "\" && rsync -r --exclude '.git/*' /home/ubuntu/repos/cookcouc6d4ea0_2.0-dev "

【问题讨论】:

  • 顺便说一句,我意识到我可以通过某种方式在 bash shell 中重定向输出,但我真的很想更好地了解 Fabric。

标签: python linux bash fabric string-interpolation


【解决方案1】:

这不是你想要的吗?

def t1():
    captured = local('ls -alh')
    print captured

http://docs.fabfile.org/en/1.8/api/core/operations.html#fabric.operations.run

run 将远程程序的标准输出的结果作为单个返回 (可能是多行)字符串。此字符串将显示失败和 成功的布尔属性,指定命令是否失败或 成功,并且还将包含返回代码作为 return_code 属性。此外,它包括请求和实际的副本 执行的命令字符串,分别为 .command 和 .real_command。

local 文档中也有这一点:

http://docs.fabfile.org/en/1.8/api/core/operations.html#fabric.operations.local

local 当前无法同时打印和 捕获输出,就像 run/sudo 一样。 capture kwarg 允许您 根据需要在打印和捕获之间切换,默认为 错误的。

当 capture=False 时,本地子进程的 stdout 和 stderr 流直接连接到您的终端,尽管您可以使用 全局输出控制 output.stdout 和 output.stderr 隐藏一个 如果需要,或者两者兼而有之。在这种模式下,返回值的 stdout/stderr 值始终为空。

当 capture=True 时,您将看不到任何 终端中子进程的输出,但返回值将 包含捕获的标准输出/标准错误。

在任何一种情况下,与 run 和 sudo,此返回值显示 return_code、stderr、失败和 成功的属性。有关详细信息,请参阅运行。

【讨论】:

  • captured = local('ls -alh', capture=True); print captured 做我想做的事。
  • 我不知道,我不能声称输出不再被捕获。使用sudo 命令,我可以捕获输出并打印出来。也许这是 Fabric 的一些奇怪的字符串插值问题。当我尝试将其作为具有常规 python 刺痛格式的字符串的一部分包含在内时,输出不会显示。我得到了很多奇怪的输出。
  • 很抱歉让您的回答不太相关。
猜你喜欢
  • 2010-10-16
  • 2021-04-23
  • 1970-01-01
  • 2012-08-15
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2014-08-28
相关资源
最近更新 更多