Python中使用subprocess.call无法将输出重定向至/dev/null的问题
解决subprocess.call重定向shell脚本输出失败的问题
我来帮你搞定这个问题!你遇到的情况是因为subprocess.call默认不会解析shell的重定向语法,除非你明确配置相关参数,下面给你两种可行的解决方案:
方案一:使用shell=True并在命令中包含重定向
如果你不担心shell注入风险(比如命令里没有用户可控的输入),可以直接把整个命令写成字符串,开启shell=True,让shell来处理重定向:
import subprocess # 同时重定向stdout和stderr到/dev/null return_code = subprocess.call("/bin/sh /usr/local/scripts/test_unknown.sh > /dev/null 2>&1", shell=True) # 你还可以捕获脚本的退出码(这里脚本exit 3,return_code会是3) print("脚本退出码:", return_code)
这里的2>&1是把标准错误(stderr)也重定向到和标准输出(stdout)一样的地方,避免脚本的错误信息(如果有的话)依然打印到终端。
方案二:通过subprocess的stdout/stderr参数重定向(更安全)
如果想避免使用shell=True(推荐在有用户输入场景下使用,防止安全问题),可以直接通过subprocess的参数指定输出目标。因为Python2.7没有subprocess.DEVNULL,我们可以手动打开/dev/null文件:
import subprocess import os # 打开/dev/null作为输出目标 with open(os.devnull, 'w') as devnull: return_code = subprocess.call( ["/bin/sh", "/usr/local/scripts/test_unknown.sh"], stdout=devnull, stderr=devnull ) print("脚本退出码:", return_code)
这种方式不需要依赖shell解析,直接让subprocess把脚本的输出写入到/dev/null,完全不会打印到终端。
为什么你之前的尝试失败?
如果之前你是直接把> /dev/null作为列表参数的一部分(比如["/bin/sh", "/usr/local/scripts/test_unknown.sh", ">", "/dev/null"]),这是无效的——因为当使用列表形式的参数时,subprocess会把每个元素直接传递给/bin/sh,/bin/sh会把>和/dev/null当成脚本的命令行参数,而不是shell的重定向指令,所以脚本的echo内容依然会输出到stdout。
内容的提问来源于stack exchange,提问作者Ronin Goda
相关产品推荐
相关产品推荐

