[英]How can I selectively save stdout in a file only for one process?
要在txt文件中捕獲SSH命令執行會話的輸出,我執行了以下操作:
sys.stdout = open('Output_Log.txt','w')
現在,一旦SSH會話關閉,我想停止寫入文件,而讓其他打印語句進入控制台。
但那並沒有發生。 后續打印將覆蓋我上面的日志文件,並且我正在丟失SSH命令執行數據。
這是完整的代碼:
session.exec_command('cd /project/neptune/neptune_psv/fw; ./Do_Regr.sh -i Testlist_Regression.in -m 135.24.237.198 -g')
stdout_data = []
stderr_data = []
sys.stdout = open('Output_Log.txt','w')
sys.stderr = open('Error_Log.txt','w')
while True:
try:
if session.recv_ready():
stdout_data.append(session.recv(16384))
if session.recv_stderr_ready():
stderr_data.append(session.recv_stderr(16384))
if session.exit_status_ready():
break
except socket.timeout:
print("SSH channel timeout exceeded.")
break
except Exception:
traceback.print_exc()
break
print 'exit status: ', session.recv_exit_status()
print ''.join(stdout_data)
print ''.join(stderr_data)
session.close()
trans.close()
print "############Regression Complete############"
當我打開Output_Log.txt時,我只找到最后一個打印件。 而如果我評論最后一個打印語句(Regression Complete),則Output_Log會很好地捕獲會話的stdout_data。
而不是重定向sys.stdout
和sys.stderr
,直接寫入文件。 您已經在列表中捕獲了輸出-利用它可以發揮自己的優勢:
try:
# capture output streams
finally:
with open('Output_Log.txt', 'w') as output:
output.write(''.join(stdout_data))
output.write('\nexit status: %s' % session.recv_exit_status())
with open('Error_Log.txt', 'w') as output:
output.write(''.join(stderr_data))
要將ssh命令的輸出保存在文件中,請勿重定向Python的stdout / stderr,而應使用subprocess
模塊:
from subprocess import call
cmd = ['ssh', 'host', 'cd /project/neptune/neptune_psv/fw; '
'./Do_Regr.sh -i Testlist_Regression.in -m 135.24.237.198 -g']
with open('Output_Log.txt', 'w') as out, open('Error_Log.txt','w') as err:
rc = call(cmd, stdout=out, stderr=err)
或者如果你想繼續使用paramiko
; 對代碼的最小更改是使用out.write
而不是stdout_data.append
和err.write
而不是stderr_data.append
,其中out
, err
是相應的文件對象。 不要重定向sys.stdout
, sys.stderr
- 這里沒有必要。
為了避免丟失數據,即使子進程已完成,也應該讀取可能緩沖的數據,即在if session.exit_status_ready()
之后讀取直到EOF(直到空結果if session.exit_status_ready()
。
好吧,使用現有代碼我找到了一個解決方案:
stdout_data = []
stderr_data = []
temp = sys.stdout --------- Added this
sys.stdout = open('Output_Log.txt','w')
sys.stderr = open('Error_Log.txt','w')
---------------Main Code---------------------
print 'exit status: ', session.recv_exit_status()
print ''.join(stdout_data)
print ''.join(stderr_data)
session.close()
trans.close()
sys.stdout.close()
sys.stdout = temp ------ Added this
print "############Regression Complete############"
這對我有用。 但我會嘗試上面提出的解決方案並稍后回復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.