- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我正在使用 python 脚本运行 exe:
subprocess.call(cmdArgs,stdout=outf, stderr=errf)
当 outf 和 errf 是文本文件的文件描述符时。
有什么方法可以在其上生成一个包含 stdout 和 stderr 的合并和同步文本文件吗?它应该用时间和来源(我们的/错误的)格式化。
谢谢
最佳答案
这有点棘手,因为您需要在子进程运行时轮询其 stdout 和 stderr 文件描述符,以获得准确的时间戳。您还需要将输出分成行列表,以便可以轻松地合并和排序最终结果。您可以在读取两个流时轻松合并它们,但这不是问题的一部分。
我写得很快,但它可以变得更简洁、更紧凑:
import datetime
import os
import select
import subprocess
class Stream(object):
def __init__(self, name, impl):
self._name = name
self._impl = impl
self._buf = ''
self._rows = []
def fileno(self):
"Pass-through for file descriptor."
return self._impl.fileno()
def read(self, drain=0):
"Read from the file descriptor. If 'drain' set, read until EOF."
while self._read() is not None:
if not drain:
break
def _read(self):
"Read from the file descriptor"
fd = self.fileno()
buf = os.read(fd, 4096)
if not buf:
return None
if '\n' not in buf:
self._buf += buf
return []
# prepend any data previously read, then split into lines and format
buf = self._buf + buf
tmp, rest = buf.rsplit('\n', 1)
self._buf = rest
now = datetime.datetime.now().isoformat()
rows = tmp.split('\n')
self._rows += [(now, '%s %s: %s' % (self._name, now, r)) for r in rows]
def run(cmd, timeout=0.1):
"""
Run a command, read stdout and stderr, prefix with timestamp, and
return a dict containing stdout, stderr and merged.
"""
PIPE = subprocess.PIPE
proc = subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE)
streams = [
Stream('stdout', proc.stdout),
Stream('stderr', proc.stderr)
]
def _process(drain=0):
res = select.select(streams, [], [], timeout)
for stream in res[0]:
stream.read(drain)
while proc.returncode is None:
proc.poll()
_process()
_process(drain=1)
# collect results, merge and return
result = {}
temp = []
for stream in streams:
rows = stream._rows
temp += rows
result[stream._name] = [r[1] for r in rows]
temp.sort()
result['merged'] = [r[1] for r in temp]
return result
res = run(['ls', '-l', '.', 'xyzabc'])
for key in ('stdout', 'stderr', 'merged'):
print
print '\n'.join(res[key])
print '-'*40
示例输出:
stdout 2011-03-03T19:30:44.838145: .:
stdout 2011-03-03T19:30:44.838145: total 0
stdout 2011-03-03T19:30:44.838338: -rw-r--r-- 1 pat pat 0 2011-03-03 19:30 bar
stdout 2011-03-03T19:30:44.838518: -rw-r--r-- 1 pat pat 0 2011-03-03 19:30 foo
----------------------------------------
stderr 2011-03-03T19:30:44.837189: ls: cannot access xyzabc: No such file or directory
----------------------------------------
stderr 2011-03-03T19:30:44.837189: ls: cannot access xyzabc: No such file or directory
stdout 2011-03-03T19:30:44.838145: .:
stdout 2011-03-03T19:30:44.838145: total 0
stdout 2011-03-03T19:30:44.838338: -rw-r--r-- 1 pat pat 0 2011-03-03 19:30 bar
stdout 2011-03-03T19:30:44.838518: -rw-r--r-- 1 pat pat 0 2011-03-03 19:30 foo
----------------------------------------
关于python - 合并并同步 stdout 和 stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984549/
我想阅读 php://stderr。怎么做到的? php://stderr 和 STDERR 是否写入同一个文件?因为在写入 php://stderr 后,我尝试使用 stream_get_conte
我不确定这个问题是 Python 还是 shell 问题。 我有一个 Python 程序,它在命令上使用子进程调用,该命令可以在 stderr 上发出错误消息。我自己的程序也使用 sys.stderr
如何重定向命令的输出,以便 stdout 和 stderr 都记录在文件中,并且我仍然希望 stderr 显示为输出。 我也不想使用 bash 来执行此操作。有这样的办法吗? 最佳答案 这很简单: $
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我得到了以下批处理命令 echo 1 & echo 2 1>&2 & echo 3 有时这会打印 1 2 3有时 132 我怎样才能控制顺序?我必须得到订单。 是否有启用以下功能的命令? echo 1
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Ruby $stdout vs. STDOUT STDERR 通常比使用 $stderr 更受青睐,还是相反
这是我经常尝试完成的任务。我想将 stderr 和 stdout 都记录到日志文件中。但我只想打印到控制台 stderr。 我尝试过使用 tee,但是一旦我使用“2>&1”合并了 stderr 和 s
我想要做的是将 stderr 重定向到 stdout,而不更改 stderr 的输出。 比如说,命令在stderr中有输出,我想将stderr中的所有内容输出到屏幕,同时还通过grep处理信息并将其保
我正在尝试重定向一些 bash 脚本输出。我想做的是: ./some_script.sh 2> error.log >> all_output.log 2>&1 我想将 stderr 放在一个文件中,
我想将 stdout 和 stderr 的输出重定向到一个公共(public)文件: ./foo.sh >stdout_and_stderr.txt 2>&1 但也只是将 stderr 重定向到一个单
我想运行几个命令,并将所有输出捕获到日志文件中。我还想将任何错误打印到屏幕上(或者可以选择将输出邮寄给某人)。 这是一个例子。以下命令将运行三个命令,并将所有输出(STDOUT 和 STDERR)写入
在其他语言中(如 bash 和 Python),当我们生成一个子进程时,这个新进程将从父进程继承 stdout 和 stderr。这意味着子进程的任何输出都将打印到终端以及父进程的输出。 我们如何在
这个问题在这里已经有了答案: IO Redirection - Swapping stdout and stderr (4 个答案) 关闭 7 年前。 我想将应该转到 stdout 的所有内容重定向
我有一个 shell 脚本,我想将其 stdout 和 stderr 写入日志文件。我知道这可以通过 sh script.sh >> both.log 2>&1 但是,我还想同时将 stderr 写入
git clone 将其输出写入 stderr,如记录 here .我可以使用以下命令重定向它: git clone https://myrepo c:\repo 2>&1 但这会将所有输出(包括错误
以下将 stdout 写入日志文件并打印 stderr: bash script.sh >> out.log 这再次将 stdout 和 stderr 写入日志文件: bash script.sh >
我正在调试一个在 PHP 5.4 上使用 Slim 和 NotORM 的项目。将 NotORM 设置为 Debug模式时,NotORM 跟踪语句: fwrite(STDERR, "$backtrace
到目前为止我所做的是: #!/bin/bash exec 2> >(sed 's/^/ERROR= /') var=$( sleep 1 ; hostname ;
我在远程机器上通过 SSH 执行一系列操作,我正在传输它的标准输出和标准错误,然后由写入器使用它,写入本地标准输出和标准错误,以及字节缓冲区。 就在编写器使用它之前,我想对其执行一系列字符串操作,然后
现在我有一些使用 Popen.communicate() 的代码从子进程(设置 stdin=PIPE 和 stderr=PIPE)运行命令并捕获 stderr 和 stdout。 问题在于 commu
我是一名优秀的程序员,十分优秀!