只是想在这上面挑选你的大脑。我有几个子进程在运行,我想将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)
这是最好的方法吗?如果我有多个进程,我想它会重新写入日志文件,这可能是个问题。在这里欣赏一些建议。感谢
答案 0 :(得分: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
文件部分:
stdin , stdout 和 stderr 分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为
PIPE
,DEVNULL
,现有文件描述符(正整数),现有文件对象和None
。PIPE
表示应创建到子项的新管道。DEVNULL
表示将使用特殊文件os.devnull
。使用默认设置None
,不会发生重定向;子项的文件句柄将从父项继承。此外,stderr
可以是STDOUT
,表示应将应用程序中的stderr
数据捕获到与stdout
相同的文件句柄中。