3

只是想在这件事上动动脑筋。我有几个子进程正在运行,我想将 stderr 和 stdout 打印到文件中。到目前为止,我已经这样做了:

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)

这是最好的方法吗?如果我有多个进程,我猜它会重写日志文件,所以这可能是一个问题。在这里欣赏一些建议。谢谢

4

1 回答 1

0

我很确定您可以将自己的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文件部分:

stdinstdoutstderr分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为PIPEDEVNULL、现有文件描述符(正整数)、现有文件对象NonePIPE表示应该创建一个到孩子的新管道。DEVNULL表示os.devnull将使用特殊文件。使用默认设置None,不会发生重定向;子文件句柄将从父文件继承。此外,stderrcan beSTDOUT表示stderr应将来自应用程序的数据捕获到与 for 相同的文件句柄中stdout

于 2013-06-13T11:47:13.600 回答