子进程在 stdout 和 os.devnull 之间选择

subprocess choose between stdout and os.devnull

对于一个项目,我想编写一个代码,我想在我的项目的各个部分重复使用。我需要执行一个命令,并希望能够在控制台打印或静音命令之间进行选择。 我想到了这个,但我不确定它是否可以,以及“with”是否以这种方式正确工作:

import os
import sys
import subprocess

def run_subprocess(cmd, display_output : bool=False):
    if display_output:
        stdout = sys.stdout
    else:
        stdout = open(os.devnull, "w")
        
    with stdout as s:
        exit_code = subprocess.call([cmd], shell=True, stdout=s)
    return exit_code

这样可以吗?我应该改变什么吗? 谢谢!

我发现了一些我正在使用的更清洁的东西,但仍然不确定它是否 'good practice' 但它似乎对我的应用程序来说还不错

import os
import subprocess

def run_subprocess(cmd, display_output: bool = False):
    with open(os.devnull, "w") as s:
        args = {'stdout': s} if display_output else {}
        exit_code = subprocess.call([cmd], shell=True, **args)
    return exit_code

为 /dev/null 使用标记 subprocess.DEVNULL 或为标准输出使用默认的 None

import subprocess

def run_subprocess(cmd, display_output: bool = False):
    stdout = None if display_output else subprocess.DEVNULL
    return subprocess.call([cmd], shell=True, stdout=stdout)

使用这些使得 subprocess 以 system-independent 的方式正确处理两个目标。