Python 织物-是否有任何方法可以捕获run stdout?

Python 织物-是否有任何方法可以捕获run stdout?,python,fabric,Python,Fabric,我正在努力做到以下几点: output = run("ls -l backups") for line in output.split("/n"): do_stuff(line) 有没有办法将ls的stdout发送到输出 更具体地说,我正在使用一个名为s3cmd的CLI应用程序,它的功能类似于ls,但使用的是远程Amazon S3存储桶 因此,不幸的是,替换ls将无济于事 你所要求的一切都应该发生。从: run将以单个(可能是多行)字符串的形式返回远程程序标准输出的结果 run(),

我正在努力做到以下几点:

output = run("ls -l backups")
for line in output.split("/n"):
    do_stuff(line)
有没有办法将
ls
stdout
发送到
输出


更具体地说,我正在使用一个名为
s3cmd
的CLI应用程序,它的功能类似于
ls
,但使用的是远程Amazon S3存储桶

因此,不幸的是,替换
ls
将无济于事



你所要求的一切都应该发生。从:

run将以单个(可能是多行)字符串的形式返回远程程序标准输出的结果

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


要进行故障排除,
打印类型(输出),请输出
,以确保响应符合预期。检查
output.failed
output.stderr
。可能是命令没有执行预期的操作,没有“备份”目录等。

请使用字符串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(),可以这样做:

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)
我希望它能帮上忙。

只需将它退回即可:

def output():
    return run("ls -l backups")
a = execute(output, host=hostname)
print a
将创建一个结果字典。

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


如果您正在使用
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)

您可能忘记了
fh.seek(0)
。当我这样做时,我在“行”中得到了一个空白内容,这是指旧版本的结构:
TypeError:run()得到了一个意外的关键字参数“stdout”
。。。output=run(cmd)print“command output:{}”。format(output.stdout).
您可能需要去除一些unicode字符:例如,使用
。stdout.strip('\x00')
在转换为int之前,这通常是一个很好的答案,但我认为OP正在寻找一次检索一行的方法。我一直在寻找的解决方案!是否有一个好方法删除所有转义码以将其保存到变量中(因此不只是使用打印)?这应该是公认的答案。顶级解决方案包含所有结构格式(IP、结构命令等)
@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)