Python 3.6 Код возврата модуля подпроцесса с командой tee - PullRequest
0 голосов
/ 21 января 2020

Я использую Python 3.6.9 для вызова следующего bash сценария:

run_cmds.sh:

ls dir_doesnt_exist | tee log

Вот Python код:

import subprocess 
from subprocess import PIPE

cmd = subprocess.run(['bash','run_cmds.sh'], stdout=PIPE, stderr=PIPE)

print(cmd.stderr.decode())
print("The returned code is:", cmd.returncode)

Запустив код Python, я получаю следующее:

ls: cannot access 'dir_doesnt_exist': No such file or directory

The returned code is: 0

Как видите, подпроцесс захватывает стандартный вывод ошибок, но returncode 0.

Что не так с моим Python сценарием?

Я ценю любую помощь.

1 Ответ

1 голос
/ 21 января 2020

Код возврата равен 0. Код возврата - это код возврата последней команды, даже если используется tee (если не установлена ​​переменная pipefail). Вы можете увидеть это в командной строке:

$ ls dir_doesnt_exist | tee log
ls: dir_doesnt_exist: No such file or directory

$ echo $?
0

Однако, если вы удалите трубу |, вы получите ненулевой код выхода

$ ls dir_doesnt_exist
ls: dir_doesnt_exist: No such file or directory

$ echo $?
1

Так при использовании tee вы должны проверить переменную $ PIPETSTATUS вместо обычного кода выхода

$ ls dir_doesnt_exist | tee log
ls: dir_doesnt_exist: No such file or directory

$ echo ${PIPESTATUS[0]}
1

Попробуйте сделать ваш python код подобным этому

import subprocess 
from subprocess import PIPE

cmd = subprocess.run(['bash','run_cmds.sh; exit ${PIPESTATUS[0]}'], stdout=PIPE, stderr=PIPE)

print(cmd.stderr.decode())
print("The returned code is:", cmd.returncode)
...