我正在尝试执行以下操作:
output = run("ls -l backups")
for line in output.split("/n"):
do_stuff(line)
有什么办法可以将
stdout
的ls
发送到output
吗?
更具体地说,我正在使用一个名为
s3cmd
的 CLI 应用程序,它的功能与 ls
类似,但具有远程 Amazon S3 存储桶。
因此,不幸的是,替换
ls
并没有帮助。
您所要求的事情应该会发生。来自文档:
run 会将远程程序的 stdout 结果作为单个(可能是多行)字符串返回。
run()
,以及相关命令,如 local()
和 sudo()
,返回一个 _AttributeString
对象,该对象只是 stdout 的包装器,具有对其他信息(如失败/成功布尔值、stderr、命令运行等)的属性访问权限。结果对象还有一个 stdout
属性,这更加明确。
要排除故障,
print type(output), output
确保响应符合您的预期。检查 output.failed
和 output.stderr
。可能是命令没有执行您期望的操作,没有“备份”目录等。
使用 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(),你可以这样做:
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)
希望有帮助。
如果您使用
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)
尝试使用“
\r\n
”进行拆分:
output = run("ls -l backups")
output_stdout = output.stdout.split("\r\n")
只需退货即可:
def output():
return run("ls -l backups")
a = execute(output, host=hostname)
print a
a 将是结果字典。
当前面料使用
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)