3
3
from functools import update_wrapper
4
4
from pathlib import Path
5
5
import traceback
6
+ import loguru
7
+
8
+
9
+ LOGURU_HANDLERS = {}
6
10
7
11
8
12
class Tee (object ):
@@ -23,10 +27,18 @@ def flush(self):
23
27
24
28
def __enter__ (self ):
25
29
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
26
34
return self
27
35
28
36
def __exit__ (self , _type , _value , _traceback ):
29
37
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 ]
30
42
31
43
32
44
class CaptureOut (object ):
@@ -41,13 +53,26 @@ def __init__(
41
53
self .capture_traceback = capture_traceback
42
54
43
55
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 ()
53
78
return res
0 commit comments