在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)
答案 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)
但我认为可能有更好的方法。