Это прямой уточняющий вопрос к ответу в здесь , который, как я думал, сработал, но это не так!
У меня есть следующий тестовый bash скрипт (testbash.sh
), который просто создает некоторый вывод и множество ошибок для целей тестирования (работает на Red Hat Enterprise Linux Server выпуск 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.
Не важно сразу получить вывод. Задержка в несколько секунд в порядке. Также, если порядок вывода немного перепутан, это не имеет значения. Важно получить на выходе all (stdout
и stderr
).
Может быть, есть более простой способ получить вывод сценария bash, который началось с python?