Fabric - 有没有办法捕获运行stdout?

Rad*_*Hex 32 python fabric

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

output = run("ls -l backups")
for line in output.split("/n"):
    do_stuff(line)
Run Code Online (Sandbox Code Playgroud)

具有任何方式stdoutls发送到output


更具体地说,我正在使用一个名为CLI的应用程序s3cmd,该应用程序ls与远程Amazon S3存储桶类似.

因此,替代品ls将无济于事.


JCo*_*ton 28

你要求的正是应该发生的事情.来自文档:

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

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

要进行故障排除,print type(output), output请确保响应符合您的预期.检查output.failedoutput.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)
Run Code Online (Sandbox Code Playgroud)

  • 太复杂了,只需使用``myvar = run("mycommand")`` (13认同)
  • 你可能会忘记`fh.seek(0)`. (4认同)
  • 这是指旧版本的 Fabric:`TypeError: run() got an Unexpected keywords argument 'stdout'` (2认同)

Evh*_*vhz 12

如果你需要使用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)
Run Code Online (Sandbox Code Playgroud)

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

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

我希望它有所帮助.


pit*_*ide 6

如果你使用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)
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试使用“ \r\n” 拆分:

output = run("ls -l backups")
output_stdout = output.stdout.split("\r\n")
Run Code Online (Sandbox Code Playgroud)