繁体   English   中英

使用 shell 管道时 subprocess.run 的返回码

[英]Return code of subprocess.run when using shell pipes

我试图了解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 shell 选项:

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

我在 subprocess 模块的文档中找不到有关此的任何信息。 我正在使用 python 3.6。 有谁知道这是如何工作的?

这不符合你的想法:

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

当您将字符串列表传递给subprocess.run并指定shell=True时,只有第一项被解释为命令(其余项作为 arguments 提供给 shell)。 比较 output 的:

>>> 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 false | true ,这是一个管道。 管道的退出代码是管道中最后一个命令的退出代码(在本例中为true )。 正如这里所讨论的,第二个调用只是运行false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM