Loc*_*ane 5 python bash subprocess
我正在使用 subprocess 在 Python 中调用 bash 命令,并且得到的返回代码与 shell 显示的不同。
import subprocess
def check_code(cmd):
print "received command '%s'" % (cmd)
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.wait()
print "p.returncode is '%d'" % (p.returncode)
exit()
if p.returncode == 0:
return True
else:
return False
#End if there was a return code at all
#End get_code()
Run Code Online (Sandbox Code Playgroud)
当发送“ls /dev/dsk &> /dev/null”时,check_code 返回 0,但“echo $?” 在终端中生成“2”:
Welcome to Dana version 0.7
Now there is Dana AND ZOL
received command 'ls /dev/dsk &> /dev/null'
p.returncode is '0'
root@Ubuntu-14:~# ls /dev/dsk &> /dev/null
root@Ubuntu-14:~# echo $?
2
root@Ubuntu-14:~#
Run Code Online (Sandbox Code Playgroud)
有谁知道这是怎么回事?
小智 4
据介绍subprocess.Popen,您的 Python 脚本中使用的 shell 是sh. 该 shell 是 POSIX 标准,与 Bash 不同,Bash 具有一些非标准功能,例如速记重定向&> /dev/null。shBourne shell 将此符号解释为“在后台运行我,并将 stdout 重定向到 /dev/null”。
由于您subprocess.Popen打开的 a在其自己的后台sh运行ls,因此使用 的返回值sh而不是ls,在本例中为 0。
如果您希望 Python 具有 Bash 行为,我相信您可能必须重新配置(可能重新编译)Python 本身。仅使用sh语法更简单,即ls /dev/dsk 2> /dev/null.