我只是想听听你的意见。我有几个子进程正在运行,我想将标准错误和标准输出打印到一个文件中。到目前为止,我已经这样做了:
def write_to_stderr_log(process):
stderr= open("stderr.log", "w")
proc_err = process.communicate()
print >> stderr, proc_err
stderr.close()
def write_to_stdout_log(process):
stdout = open("stdout.log", "w")
proc_out = process.communicate()
print >> stdout, proc_out
stdout.close()
def logger():
logger = logging.getLogger('error_testing')
hdlr = logging.FileHandler('error.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.WARNING)
logger.error('We have a problem')
logger.debug('debugging')
logger.info('some info')
logger()
proc = subprocess.Popen(['FastTree -nt test.fasta'], bufsize=512, stdin = None, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True)
write_to_stderr_log(proc)
write_to_stdout_log(proc)
这是最好的方法吗?如果我有多个进程,我猜它会重写日志文件,所以这可能是一个问题。感谢你的建议。由于
我很确定您可以提供自己的file
实例作为subprocess.Popen
的关键字。
>>> out = open('stdout.log', 'wb')
>>> err = open('stderr.log', 'wb')
>>> child = subprocess.Popen('FastTree -nt test.fasta', stdin=None, stdout=out,
stderr=err)
>>> rc = child.wait()
>>> out.close()
>>> err.close()
以下是subprocess.Popen
文档中重要的部分:
stdin、stdout和stderr分别指定所执行程序的标准输入、标准输出和标准错误文件句柄。有效值为
PIPE
、DEVNULL
、已存在的文件描述符(正整数)、已存在的文件对象和None
。PIPE
表示应该创建一个到子进程的新管道。DEVNULL
表示使用特殊文件os.devnull
。使用None
的默认设置,将不会发生重定向;子进程的文件句柄将从父进程继承。此外,stderr
可以是STDOUT
,这表明stderr
数据应该被捕获到与stdout
相同的文件句柄中。