【问题标题】:subprocess choose between stdout and os.devnull子进程在 stdout 和 os.devnull 之间进行选择
【发布时间】:2020-10-08 07:55:10
【问题描述】:

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

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

【问题讨论】:

    标签: python subprocess stdout


    【解决方案1】:

    使用标记subprocess.DEVNULL 代替/dev/null 或默认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 以独立于系统的方式正确处理两个目标。

    【讨论】:

    • 它似乎工作得很好!更优雅:) 谢谢! (不再需要 sys 和 os,函数中也不需要 'if' 而不是 'of')
    • @th0mash 感谢您指出错别字和死代码,将两者都删除。
    【解决方案2】:

    我发现了一些我正在使用的更清洁的方法,但仍然不确定它是否是“好习惯”,但它似乎对我的应用程序来说还不错

    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
    

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2010-12-06
      • 2012-04-13
      • 2013-06-06
      • 1970-01-01
      相关资源
      最近更新 更多