python:将每个线程的输出打印到单独的文件中

时间:2013-10-19 20:16:50

标签: python multithreading output

我有几个线程,每个线程将输出写入stdout。但是,我想将每个线程的输出重定向到彼此独立的单独文件。

我的意思如下:

  • Thread1将每个打印,每个异常和每个其他输出写入file1.log
  • Thread2将每个打印,每个异常和每个其他输出写入file2.log
  • 等等。

所以我正在寻找的是为每个线程专门设置stdout。但是,设置stdout只能全局工作意味着Thread1和Tread2将始终写入相同的已定义的stdout。 我还没有发现如何做到这一点。 python日志记录与此不相符,因为我已经检查了这个。

我该怎么做?

编辑:基于dbra的答案,我编写了以下用于演示日志记录的小程序:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from multiprocessing import Process
import sys

class SubRunner(object):

    def print_something( self, name ):
        print name + ": print something"


class MainRunner(object):

    def __init__(self, name):        
        self.sub_runner = SubRunner()
        self.name = name


    def runme(self,dummy):
        sys.stdout = open('example_' + self.name + ".log", "w")
        self.sub_runner.print_something( self.name )


#Main program
m1 = MainRunner("M1")
m2 = MainRunner("M2")

p1 = Process(target=m1.runme, args=('',) )
p2 = Process(target=m2.runme, args=('',) )

p1.start()
p2.start()

p1.join()
p2.join()

2 个答案:

答案 0 :(得分:1)

线程共享相同的文件描述符表,不能将stdout重定向到不同的文件。

相反,它可以使用multiprocessing代替threading库,here an example of different file for different pid

答案 1 :(得分:0)

您创建了一个进程而不是一个共享没有内存空间的线程。 所以你可以简单地在子进程中设置sys.stdout,它永远不会影响其他子进程或主进程。