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

Python 子进程在stdout和os.devnull之间进行选择,python,subprocess,stdout,Python,Subprocess,Stdout,对于一个项目,我想写一个代码,我想在我的项目的各个部分重用。我需要执行一个命令,并希望能够在控制台中打印或静音命令之间进行选择。 我已经想到了这一点,但我不确定它是否正常,以及“with”是否以这种方式正确工作: import os import sys import subprocess def run_subprocess(cmd, display_output : bool=False): if display_output: stdout = sys.stdou

对于一个项目,我想写一个代码,我想在我的项目的各个部分重用。我需要执行一个命令,并希望能够在控制台中打印或静音命令之间进行选择。 我已经想到了这一点,但我不确定它是否正常,以及“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
这样可以吗?我应该换点什么吗?
谢谢

我发现了一些我正在使用的更干净的东西,仍然不确定这是否是“良好实践”,但对于我的应用程序来说似乎还不错

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
将sentinel用于/dev/null,或将默认的
None
用于stdout:

导入子流程
def run_子流程(cmd,显示_输出:bool=False):
stdout=None如果显示\u输出else subprocess.DEVNULL
返回subprocess.call([cmd],shell=True,stdout=stdout)

使用这些工具可以使
子流程
以独立于系统的方式正确处理这两个目标。

它似乎工作得很好!更加优雅:)谢谢!(不再需要sys和os,也不用函数中的“if”而不用“of”)@th0mash感谢您指出了拼写错误和死代码,两者都删除了。