問題は、FG
出力をプログラムの stdout に直接リダイレクトすることです。https://github.com/tomerfiliba/plumbum/blob/master/plumbum/commands.py#L611を参照してください
出力がこのようにリダイレクトされると、plumbum の機構を通過しないため、例外オブジェクトで取得されません。終了するまでブロックする場合はslow_cmd
、stdout から自分で読み取ることをお勧めします。ここにスケッチがあります:
lines = []
p = slow_cmd.popen()
while p.poll() is None:
line = p.stdout.readline()
lines.append(line)
print line
if p.returncode != 0:
print "see log file..."
より洗練された解決策はFG
、出力ストリームを複製する独自の ExecutionModifier ( など) を作成することです。それを呼び出しましょうTEE
(http://en.wikipedia.org/wiki/Tee_(command)の後)...私はそれをテストしていませんが、トリックを行う必要があります(select
stdout/errを除く):
class TEE(ExecutionModifier):
def __init__(self, retcode = 0, dupstream = sys.stdout):
ExecutionModifier.__init__(self, retcode)
self.dupstream = dupstream
def __rand__(self, cmd):
p = cmd.popen()
stdout = []
stderr = []
while p.poll():
# note: you should probably select() on the two pipes, or make the pipes nonblocking,
# otherwise readline would block
so = p.stdout.readline()
se = p.stderr.readline()
if so:
stdout.append(so)
dupstream.write(so)
if se:
stderr.append(se)
dupstream.write(se)
stdout = "".join(stdout)
stderr = "".join(stderr)
if p.returncode != self.retcode:
raise ProcessExecutionError(p.argv, p.returncode, stdout, stderr)
return stdout, stderr
try:
stdout, stderr = slow_cmd & TEE()
except ProcessExecutionError as e:
pass # find the log file, etc.