2017-03-13 44 views
0

在蟒> = 3.5我們可以給可選stdout, stdin, stderrsubprocess.run()到每the docssubprocess.run管理可選stdin和stdout

有效值是PIPE,DEVNULL,現有的文件描述符(正整數), 現有的文件對象和None。 PIPE表明,新的管道孩子 應創建

我要支持通過(至少)None或現有的同時pythonically管理資源的文件對象。

我應該如何在像管理可選文件資源:

import subprocess 

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

回答

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) 

但我認爲可能有更好的方法。