私は次のことをしようとしています:
output = run("ls -l backups")
for line in output.split("/n"):
do_stuff(line)
stdout
のls
をoutput
に送信する方法はありますか?
具体的には、ls
に似ていますが、リモートAmazon S3バケットを使用するs3cmd
というCLIアプリを使用しています。
そのため、残念ながらls
の置き換えは役に立ちません。
まさにあなたが求めていることは起こっているはずです。 docs から:
runは、リモートプログラムの標準出力の結果を単一の(複数行の可能性が高い)文字列として返します。
run()
、およびlocal()
やSudo()
などの関連コマンドは、次のような追加情報への属性アクセスを持つstdoutの単なるラッパーである__AttributeString
_オブジェクトを返します失敗/成功のブール値、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は結果の辞書になります。