Reputation: 25577
I'm trying to do the following:
output = run("ls -l backups")
for line in output.split("/n"):
do_stuff(line)
Any way of having the stdout
of ls
sent to output
?
To be more specific: I'm using a CLI app called s3cmd
which does something similar to ls
, but with remote Amazon S3 buckets.
So, a replacement for ls
won't help, unfortunately.
Upvotes: 35
Views: 40073
Reputation: 38247
The current fabric uses hide=True
, e.g.
result = Connection('web1.example.com').run('uname -s', hide=True)
It can then be accessed with result.stdout
. For your case, it should be
output = run("ls -l backups", hide=True)
for line in output.stdout.split("/n"):
do_stuff(line)
Upvotes: 1
Reputation: 187
Try as below using 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)
Upvotes: 17
Reputation: 678
You can also use this if you are using the local()
api, by setting the 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)
Upvotes: 8
Reputation: 166
Try split using "\r\n
":
output = run("ls -l backups")
output_stdout = output.stdout.split("\r\n")
Upvotes: 7
Reputation: 421
Just simply return it:
def output():
return run("ls -l backups")
a = execute(output, host=hostname)
print a
a will be dictionary of results.
Upvotes: 1
Reputation: 9275
In case you need to use run(), you can do it like this:
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)
For local() there is a bit more simple solution:
command = 'ls -l backups'
output = local(command, capture=True)
for line in output.splitlines():
do_stuff(line)
I hope it helps.
Upvotes: 15
Reputation: 11760
Exactly what you are asking for should be happening. From the docs:
run will return the result of the remote program’s stdout as a single (likely multiline) string.
run()
, and related commands like local()
and sudo()
, return an _AttributeString
object that is just a wrapper around stdout with attribute access to additional information like failure/success booleans, stderr, the command run, etc. The result object also has a stdout
attribute, which is just more explicit.
To troubleshoot, print type(output), output
to be sure the response is what you expect. Examine output.failed
and output.stderr
. It could be the command isn't doing what you expect, there is no "backups" directory, etc.
Upvotes: 28