subprocess.run管理可选的stdin和stdout

时间:2017-03-13 16:24:22

标签: subprocess python-3.5 contextmanager

在python> = 3.5中,我们可以为stdout, stdin, stderr提供可选的subprocess.run()

per the docs

  

有效值是PIPE,DEVNULL,现有文件描述符(正整数),   现有文件对象,无。 PIPE表示给孩子的新管道   应该创建

我希望支持传递(至少)None或现有文件对象,同时以python方式管理资源。

我应该如何管理可选文件资源:

import subprocess

def wraps_subprocess(args=['ls', '-l'], stdin=None, stdout=None):
    # ... do important stuff
    subprocess.run(args=args, stdin=stdin, stdout=stdout)

1 个答案:

答案 0 :(得分:0)

自定义contextmanager(来自this answer的想法)似乎有效:

import contextlib

@contextlib.contextmanager
def awesome_open(path_or_file_or_none, mode='rb'):
    if isinstance(path_or_file_or_none, str):
        file_ = needs_closed = open(path_or_file_or_none, mode)
    else:
        file_ = path_or_file_or_none
        needs_closed = None
    try:
        yield file_
    finally:
        if needs_closed:
            needs_closed.close()

将像

一样使用

导入子流程

def wraps_subprocess(args=['ls', '-l'], stdin=None, stdout=None):
    # ... do important stuff
    with awesome_open(stdin, mode='rb') as fin, awesome_open(stdout, mode='wb') as fout:
        subprocess.run(args=args, stdin=fin, stdout=fout)

但我认为可能有更好的方法。