Fabric - 有什么方法可以捕获运行标准输出吗?

问题描述 投票:0回答:7

我正在尝试执行以下操作:

output = run("ls -l backups")
for line in output.split("/n"):
    do_stuff(line)

有什么办法可以将

stdout
ls
发送到
output
吗?


更具体地说,我正在使用一个名为

s3cmd
的 CLI 应用程序,它的功能与
ls
类似,但具有远程 Amazon S3 存储桶。

因此,不幸的是,替换

ls
并没有帮助。


python fabric
7个回答
28
投票

您所要求的事情应该会发生。来自文档

run 会将远程程序的 stdout 结果作为单个(可能是多行)字符串返回。

run()
,以及相关命令,如
local()
sudo()
,返回一个
_AttributeString
对象,该对象只是 stdout 的包装器,具有对其他信息(如失败/成功布尔值、stderr、命令运行等)的属性访问权限。结果对象还有一个
stdout
属性,这更加明确。

要排除故障,

print type(output), output
确保响应符合您的预期。检查
output.failed
output.stderr
。可能是命令没有执行您期望的操作,没有“备份”目录等。


17
投票

使用 String IO 尝试如下

from fabric.api import *
from StringIO import StringIO

fh = StringIO()
run("ls -l backups", stdout=fh)

fh.seek(0)
for line in fh.readlines():
    do_stuff(line)

15
投票

如果你需要使用run(),你可以这样做:

with settings(
    hide('warnings', 'running', 'stdout', 'stderr'),
    warn_only=True
):
    command = 'ls -l backups'
    output = run(command)
    for line in output.splitlines():
        do_stuff(line)

对于 local() 有一个更简单的解决方案:

command = 'ls -l backups'
output = local(command, capture=True)
for line in output.splitlines():
    do_stuff(line)

希望有帮助。


8
投票

如果您使用

local()
api,也可以通过设置
capture=True

来使用此功能
@task
def login_ecr_docker():
    ecr_login = local("aws ecr get-login --region us-west-2", capture=True)
    docker_login = ecr_login.stdout
    status = local(docker_login, capture=True)
    print (status.stdout)

7
投票

尝试使用“

\r\n
”进行拆分:

output = run("ls -l backups")
output_stdout = output.stdout.split("\r\n")

1
投票

只需退货即可:

def output():
    return run("ls -l backups")
a = execute(output, host=hostname)
print a

a 将是结果字典。


0
投票

当前面料使用

hide=True
,例如

result = Connection('web1.example.com').run('uname -s', hide=True)

然后可以使用

result.stdout
访问它。对于你的情况,应该是

output = run("ls -l backups", hide=True)
for line in output.stdout.split("/n"):
    do_stuff(line)
© www.soinside.com 2019 - 2024. All rights reserved.