33from functools import update_wrapper
44from pathlib import Path
55import traceback
6+ import loguru
7+
8+
9+ LOGURU_HANDLERS = {}
610
711
812class Tee (object ):
@@ -23,10 +27,18 @@ def flush(self):
2327
2428 def __enter__ (self ):
2529 setattr (sys , self .stream_type , self )
30+ fname = repr (self .file )
31+ if fname not in LOGURU_HANDLERS :
32+ loguru_handler = loguru .logger .add (self .file )
33+ LOGURU_HANDLERS [fname ] = loguru_handler
2634 return self
2735
2836 def __exit__ (self , _type , _value , _traceback ):
2937 setattr (sys , self .stream_type , self .stream )
38+ fname = repr (self .file )
39+ if fname in LOGURU_HANDLERS :
40+ loguru .logger .remove (LOGURU_HANDLERS [fname ])
41+ del LOGURU_HANDLERS [fname ]
3042
3143
3244class CaptureOut (object ):
@@ -41,13 +53,26 @@ def __init__(
4153 self .capture_traceback = capture_traceback
4254
4355 def __call__ (self , * args , ** kwargs ) -> T .Any :
44- with open (self .stdout_file , 'w' ) as fo , \
45- open (self .stderr_file , 'w' ) as fe :
46- with Tee (fo , 'stdout' ), Tee (fe , 'stderr' ):
47- try :
48- res = self .func (* args , ** kwargs )
49- except Exception as e :
50- if self .capture_traceback :
51- traceback .print_exc (file = fe )
52- raise e
56+ if not self .stdout_file .parent .exists ():
57+ self .stdout_file .parent .mkdir (parents = True , exist_ok = True ) # pragma: no cover
58+ if not self .stderr_file .parent .exists ():
59+ self .stderr_file .parent .mkdir (parents = True , exist_ok = True ) # pragma: no cover
60+
61+ if self .stdout_file == self .stderr_file :
62+ outf = open (self .stdout_file , 'a' )
63+ errf = outf
64+ else :
65+ outf = open (self .stdout_file , 'a' )
66+ errf = open (self .stderr_file , 'a' )
67+ with Tee (outf , 'stdout' ), Tee (errf , 'stderr' ):
68+ try :
69+ res = self .func (* args , ** kwargs )
70+ except Exception as e :
71+ if self .capture_traceback :
72+ traceback .print_exc ()
73+ raise e
74+ finally :
75+ outf .close ()
76+ if self .stdout_file != self .stderr_file :
77+ errf .close ()
5378 return res
0 commit comments