File tree Expand file tree Collapse file tree 2 files changed +31
-2
lines changed
Expand file tree Collapse file tree 2 files changed +31
-2
lines changed Original file line number Diff line number Diff line change @@ -138,9 +138,22 @@ class FileHandler(Handler):
138138 """File handler which supports reopening of logs.
139139 """
140140
141- def __init__ (self , filename , mode = "a" ):
141+ def __init__ (self , filename , mode = 'a' ):
142142 Handler .__init__ (self )
143- self .stream = open (filename , mode )
143+
144+ try :
145+ self .stream = open (filename , mode )
146+ except OSError as e :
147+ if mode == 'a' and e .errno == errno .ESPIPE :
148+ # Python 3 can't open special files like
149+ # /dev/stdout in 'a' mode due to an implicit seek call
150+ # that fails with ESPIPE. Retry in 'w' mode.
151+ # See: http://bugs.python.org/issue27805
152+ mode = 'w'
153+ self .stream = open (filename , mode )
154+ else :
155+ raise
156+
144157 self .baseFilename = filename
145158 self .mode = mode
146159
Original file line number Diff line number Diff line change @@ -220,6 +220,22 @@ def test_emit_error(self):
220220 self .assertTrue (dummy_stderr .written .endswith ('OSError\n ' ),
221221 dummy_stderr .written )
222222
223+ if os .path .exists ('/dev/stdout' ):
224+ StdoutTestsBase = FileHandlerTests
225+ else :
226+ # Skip the stdout tests on platforms that don't have /dev/stdout.
227+ StdoutTestsBase = object
228+
229+ class StdoutTests (StdoutTestsBase ):
230+ def test_ctor_with_dev_stdout (self ):
231+ handler = self ._makeOne ('/dev/stdout' )
232+ # Modes 'w' and 'a' have the same semantics when applied to
233+ # character device files and fifos.
234+ self .assertTrue (handler .mode in ['w' , 'a' ], handler .mode )
235+ self .assertEqual (handler .baseFilename , '/dev/stdout' )
236+ self .assertEqual (handler .stream .name , '/dev/stdout' )
237+ handler .close ()
238+
223239class RotatingFileHandlerTests (FileHandlerTests ):
224240
225241 def _getTargetClass (self ):
You can’t perform that action at this time.
0 commit comments