print呼び出し中に入出力エラーが発生したため、定期的に(ランダムに)エラーが発生するコードを継承しました。私は例外の原因を特定しようとしています(または少なくともそれをよりよく理解しています)、そしてそれを正しく処理する方法があります。印刷時のIOError入出力エラー
のPythonの次の行(2.6.6インタプリタで、CentOSの5.5上で実行されている)を実行する:
print >> sys.stderr, 'Unable to do something: %s' % command
例外が発生する(トレースバック省略):コンテキストについて
IOError: [Errno 5] Input/output error
をこれは、一般に、より大きい関数がその時にしようとしているものです:
from subprocess import Popen, PIPE
import sys
def run_commands(commands):
for command in commands:
try:
out, err = Popen(command, shell=True, stdout=PIPE, stderr=PIPE).communicate()
print >> sys.stdout, out
if err:
raise Exception('ERROR -- an error occurred when executing this command: %s --- err: %s' % (command, err))
except:
print >> sys.stderr, 'Unable to do something: %s' % command
run_commands(["ls", "echo foo"])
>>
の構文は私にとってよく知られているわけではありません。頻繁に使用するものではありません。おそらくleast preferred wayがstderrに書き込まれていることを理解しています。しかし、代替案が根本的な問題を解決するとは思わない。
私が読んだドキュメントから、IOError 5はしばしば誤って使用され、やや緩やかに定義されています。さまざまなオペレーティングシステムを使用してさまざまな問題をカバーしています。私が私のケースで見ることができる最高ののは、Pythonのプロセスがもはや端末/ ptyに接続されていないということです。
stdout/stderrストリームからプロセスを切断することは何も言えません。端末はまだ開いていますが、すべてが正常であると表示されます。それは、子プロセスが不正な方法で終了することによって引き起こされる可能性がありますか?この問題の原因は他に何か - それをさらにデバッグするために私が何を紹介することができますか?
例外処理に関しては、明らかにそれをキャッチすることができますが、これは残りの実行のためにstdout/stderrに印刷できないことを意味しています。これらのストリームに何らかの形で再接続できますか?おそらくsys.stdout
をsys.__stdout__
などにリセットしますか?この場合、stdout/stderrに書き込むことができないということは致命的とはみなされませんが、何かが間違って始まることを示すものであれば、私はむしろ早く退会したいと思います。
私は、私は非常によく似た問題を抱えていた
この質問を閲覧した人はほんの数人しかいないことがわかります。コメントや回答はありません。質問の構成が不十分/不明な場合は、改善に役立てて回答に向けて作業してください。 –
私はこのエラーも解消しています。だから時々このエラーを得るのは面倒です。 –
いくつかの返事について悪いと感じないでください。あなたの質問とフォーマットは素晴らしいです。これは単に答えが難しい質問です。 – culix