gpt4 book ai didi

python - 使用 plumbum 捕获前台命令的错误输出

转载 作者:太空狗 更新时间:2023-10-29 23:59:51 32 4
gpt4 key购买 nike

我正在使用 plumbum python 库 (http://plumbum.readthedocs.org/) 作为 shell 脚本的替代品。

有一个我想运行的命令,当它失败时它会输出我感兴趣的文件的路径:

$ slow_cmd
Working.... 0%
Working.... 5%
Working... 15%
FAIL. Check log/output.log for details

我想在前台运行程序查看进度:

from plumbum.cmd import slow_cmd

try:
f = slow_cmd & FG
except Exception, e:
print "Something went wrong."

# Need the error output from f to get the log file :(

slow_cmd 失败时,它会抛出异常(我可以捕捉到)。但是我无法从异常或 f future 对象中获取错误输出。

如果我不在 FG 上运行 slow_cmd,异常包含所有输出,我可以从那里读取文件。

最佳答案

问题是,FG 将输出直接重定向到程序的标准输出。见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..."

一个更优雅的解决方案是编写您自己的 ExecutionModifier(如 FG)来复制输出流。我们称它为 TEE(在 http://en.wikipedia.org/wiki/Tee_(command) 之后)...我还没有测试过它,但它应该可以解决问题(减去 stdout/err 上的 selecting):

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.

关于python - 使用 plumbum 捕获前台命令的错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14226029/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com