我有
a.sh
如下
#!/bin/bash
echo 100
python3 b.py
if [ $? -ne 0 ]; then
exit 1
fi
echo "this will not be printed"
和
b.py
如下
import subprocess
print("101")
result = subprocess.run(["bash", "c.sh"], capture_output=True, text=True)
print(result.stderr)
print(result.stdout)
if result.check_returncode:
raise Exception("")
和
c.sh
如下:
#!/bin/bash
echo 102 >&2
echo 103
echo 104 >&2
exit 1
echo "this will not be printed"
在 bash 终端中运行 bash a.sh,结果是
100
101
102
104
103
Traceback (most recent call last):
File "/Users/abamavad/ssc-github/ssce/cmn-deployment/b.py", line 9, in <module>
raise Exception("")
Exception
我正在寻找一种方法来保持日志的顺序,以便我得到
100
101
102
103
104
Traceback (most recent call last):
File "/Users/abamavad/ssc-github/ssce/cmn-deployment/b.py", line 9, in <module>
raise Exception("")
Exception
我知道我的问题出在哪里:
result = subprocess.run(["bash", "c.sh"], capture_output=True, text=True)
print(result.stderr)
print(result.stdout)
但不知道如何解决。我应该如何维护日志的顺序,无论它们是标准输出还是标准输入
如果您尝试读取
stdout
和 stderr
,那么当您读取它们时,它们已经是乱码了,而您需要在操作系统级别合并 stdout
和 stderr
,通过传递 stdout=subprocess.PIPE, stderr=subprocess.STDOUT
.
result = subprocess.run(["bash", "c.sh"], stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, text=True)