[英]Fabric - Is there any way to capture run stdout?
我正在嘗試執行以下操作:
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將是結果字典。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.