我正在尝试执行以下操作:
output = run("ls -l backups")
for line in output.split("/n"):
do_stuff(line)
Run Code Online (Sandbox Code Playgroud)
具有任何方式stdout的ls发送到output?
更具体地说,我正在使用一个名为CLI的应用程序s3cmd,该应用程序ls与远程Amazon S3存储桶类似.
因此,替代品ls将无济于事.
JCo*_*ton 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)
Run Code Online (Sandbox Code Playgroud)
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)
我希望它有所帮助.
如果你使用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)