簡體   English   中英

Fabric - 有沒有辦法捕獲運行stdout?

[英]Fabric - Is there any way to capture run stdout?

我正在嘗試執行以下操作:

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

具有的任何stdoutls發送到output


更具體地說,我正在使用名為s3cmd的CLI應用程序,該應用程序執行與ls類似的操作,但使用遠程Amazon S3存儲桶。

因此,遺憾的是,替換ls無濟於事。


你要求的正是應該發生的事情。 來自文檔

run將遠程程序的stdout的結果作為單個(可能是多行)字符串返回。

run()和相關命令(如local()sudo()返回一個_AttributeString對象,該對象只是stdout的包裝器,具有對失敗/成功布爾值,stderr,命令運行等其他信息的屬性訪問權限。結果對象還有一個stdout屬性,它更加明確。

要進行故障排除,請print type(output), output以確保響應符合您的預期。 檢查output.failedoutput.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將是結果字典。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM