[英]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.