python中subprocess的getoutput()等效方法

81 投票
3 回答
143980 浏览
提问于 2025-04-16 21:18

我想在一个Python脚本里获取一些命令行指令的输出,比如 ls 或者 df。我发现 commands.getoutput('ls') 这个方法已经不推荐使用了,而 subprocess.call('ls') 只会给我返回一个状态码。

我希望能有一个简单的解决办法。

3 个回答

12

要捕捉使用 subprocess.check_output() 产生的错误,你可以用 CalledProcessError。如果你想把输出当作字符串来用,就需要把它从字节码解码成普通文本。

# \return String of the output, stripped from whitespace at right side; or None on failure.
def runls():
    import subprocess
    try:
        byteOutput = subprocess.check_output(['ls', '-a'], timeout=2)
        return byteOutput.decode('UTF-8').rstrip()
    except subprocess.CalledProcessError as e:
        print("Error in ls -a:\n", e.output)
        return None
57

对于Python版本在2.7及以上的,可以使用 subprocess.check_output() 这个方法。

点击这里查看相关文档

117

使用 subprocess.Popen

import subprocess
process = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
print(out)

需要注意的是,使用 communicate 方法会一直等到这个进程结束才会继续执行。如果你想在进程结束之前就获取输出,可以使用 process.stdout.readline()。想了解更多信息,可以查看 文档

撰写回答