使用python的子进程调用其他进程时如何保持日志的顺序

问题描述 投票:0回答:1

我有

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)

但不知道如何解决。我应该如何维护日志的顺序,无论它们是标准输出还是标准输入

python linux subprocess
1个回答
0
投票

如果您尝试读取

stdout
stderr
,那么当您读取它们时,它们已经是乱码了,而您需要在操作系统级别合并
stdout
stderr
,通过传递
stdout=subprocess.PIPE, stderr=subprocess.STDOUT
.

result = subprocess.run(["bash", "c.sh"], stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT, text=True)
© www.soinside.com 2019 - 2024. All rights reserved.