这是一个直接针对这里的回答进行澄清的问题,我以为它能够起作用,但事实并非如此!
我有以下测试bash脚本(testbash.sh
),它只是为了测试目的创建一些输出和许多错误(在Red Hat Enterprise Linux Server release 7.6 (Maipo)和Ubuntu 16.04.6 LTS上运行):
export MAX_SEED=2
echo "Start test"
pids=""
for seed in `seq 1 ${MAX_SEED}`
do
python -c "raise ValueError('test')" &
pids="${pids} $!"
done
echo "pids: ${pids}"
wait $pids
echo "End test"
如果我运行这个脚本,我会得到以下输出:
Start test
pids: 68322 68323
Traceback (most recent call last):
File "<string>", line 1, in <module>
ValueError: test
Traceback (most recent call last):
File "<string>", line 1, in <module>
ValueError: test
[1]- Exit 1 python -c "raise ValueError('test')"
[2]+ Exit 1 python -c "raise ValueError('test')"
End test
这是预期的结果。没问题。我想要获得错误!
现在这里是应该捕获所有输出的 Python 代码:
from __future__ import print_function
import sys
import time
from subprocess import PIPE, Popen, STDOUT
from threading import Thread
try:
from queue import Queue, Empty
except ImportError:
from Queue import Queue, Empty # python 2.x
ON_POSIX = 'posix' in sys.builtin_module_names
def enqueue_output(out, queue):
for line in iter(out.readline, b''):
queue.put(line.decode('ascii'))
out.close()
p = Popen(['. testbash.sh'], stdout=PIPE, stderr=STDOUT, bufsize=1, close_fds=ON_POSIX, shell=True)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()
# read line without blocking
while t.is_alive():
#time.sleep(1)
try:
line = q.get(timeout=.1)
except Empty:
print(line)
pass
else:
# got line
print(line, end='')
p.wait()
print('returncode = {}'.format(p.returncode))
但是当我运行这段代码时,只会得到以下输出:
Start test
pids: 70191 70192
Traceback (most recent call last):
returncode = 0
或者输出以下内容(不包括行
End test
):Start test
pids: 10180 10181
Traceback (most recent call last):
File "<string>", line 1, in <module>
ValueError: test
Traceback (most recent call last):
File "<string>", line 1, in <module>
ValueError: test
returncode = 0
大部分输出都不见了!我该怎么解决?还有,我需要一些方法来检查bash脚本中是否有任何命令没有成功执行。在这个例子中就是这种情况,但打印出的错误代码仍为0。我期望一个错误代码 != 0。
重要的是不必立即获得输出。几秒钟的延迟是可以接受的。如果输出顺序有点混乱也不要紧。重要的是获取所有输出(stdout和stderr)。
也许有一种更简单的方法只从python启动bash脚本并获取其输出?
/bin/sh: ./testbash.sh: 没有那个文件或目录
! - Alex