web-dev-qa-db-ja.com

ファブリック-run stdoutをキャプチャする方法はありますか?

私は次のことをしようとしています:

output = run("ls -l backups")
for line in output.split("/n"):
    do_stuff(line)

stdoutlsoutputに送信する方法はありますか?


具体的には、lsに似ていますが、リモートAmazon S3バケットを使用するs3cmdというCLIアプリを使用しています。

そのため、残念ながらlsの置き換えは役に立ちません。


31
RadiantHex

まさにあなたが求めていることは起こっているはずです。 docs から:

runは、リモートプログラムの標準出力の結果を単一の(複数行の可能性が高い)文字列として返します。

run()、およびlocal()Sudo()などの関連コマンドは、次のような追加情報への属性アクセスを持つstdoutの単なるラッパーである__AttributeString_オブジェクトを返します失敗/成功のブール値、stderr、コマンドの実行など。結果オブジェクトには、より明示的なstdout属性もあります。

トラブルシューティングを行うには、print type(output), outputを使用して、応答が期待どおりであることを確認してください。 _output.failed_および_output.stderr_を調べます。コマンドが期待どおりに動作していない、「バックアップ」ディレクトリがないなどの可能性があります。

26
JCotton

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)
17
user1406490

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)

役に立てば幸いです。

12
Evhz

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)
5
pitaside

\r\n ":

output = run("ls -l backups")
output_stdout = output.stdout.split("\r\n")
4
Itay Katz

単に返すだけです:

def output():
    return run("ls -l backups")
a = execute(output, Host=hostname)
print a

aは結果の辞書になります。

1
Bekzot Asimov