簡體   English   中英

如何只為一個進程選擇性地將stdout保存在文件中?

[英]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.stdoutsys.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.appenderr.write而不是stderr_data.append ,其中outerr是相應的文件對象。 不要重定向sys.stdoutsys.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.

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