You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:02:35