Код возврата subprocess.run при использовании каналов оболочки - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь понять код возврата subprocess.run:

>>> subprocess.run('false | true', shell=True)
CompletedProcess(args='false | true', returncode=0)
>>> subprocess.run(['false', '|', 'true'])
CompletedProcess(args=['false', '|', 'true'], returncode=1)
>>> subprocess.run(['false', '|', 'true'], shell=True)
CompletedProcess(args=['false', '|', 'true'], returncode=1)

Похоже, что указание cmd в качестве списка строк также устанавливает оболочку pipefail option:

$ false | true
$ echo $?
0
$ set -o pipefail
$ false | true
$ echo $?
1

Я не могу найти никакой информации об этом в документации модуля subprocess. Я использую python 3.6. Кто-нибудь знает, как это работает?

1 Ответ

1 голос
/ 06 мая 2020

Это не то, что вы думаете:

>>> subprocess.run(['false', '|', 'true'], shell=True)

Когда вы передаете список строк в subprocess.run и указываете shell=True, только первый элемент интерпретируется как команда (оставшиеся элементы предоставляются в качестве аргументов оболочки). Сравните вывод:

>>> subprocess.run('echo hello world', shell=True)
hello world
CompletedProcess(args='echo hello world', returncode=0)

С:

>>> subprocess.run(['echo', 'hello', 'world'], shell=True)

CompletedProcess(args=['echo', 'hello', 'world'], returncode=0)

С:

>>> subprocess.run(['echo $0 $1', 'hello', 'world'], shell=True)
hello world
CompletedProcess(args=['echo $0 $1', 'hello', 'world'], returncode=0)

Итак, то, что у вас есть, эквивалентно:

>>> subprocess.run('false', shell=True)

А знаете ли вы, почему коды возврата subprocess.run ('false | true', shell = True) и subprocess.run (['false', '|', 'true']) равны разные?

Потому что первый запускает false | true, который является конвейером. Код выхода конвейера - это код выхода последней команды в конвейере (в данном случае true). Второй вызов, как обсуждалось здесь, просто запускает false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...