Skip to content

Commit 388c325

Browse files
author
Shane Hathaway
committed
Simplified the /dev/stdout patch for Python 3.
It turns out libc applies a blunt policy: if you try to open a file in 'a' mode and the seek fails with ESPIPE, libc just ignores the failed seek. This change makes Supervisor behave the same way.
1 parent ac4f317 commit 388c325

File tree

1 file changed

+11
-17
lines changed

1 file changed

+11
-17
lines changed

supervisor/loggers.py

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import os
1111
import errno
12-
import stat
1312
import sys
1413
import time
1514
import traceback
@@ -139,29 +138,24 @@ class FileHandler(Handler):
139138
"""File handler which supports reopening of logs.
140139
"""
141140

142-
def __init__(self, filename, mode=None):
141+
def __init__(self, filename, mode='a'):
143142
Handler.__init__(self)
144-
open_mode = mode or 'a'
145143

146144
try:
147-
self.stream = open(filename, open_mode)
145+
self.stream = open(filename, mode)
148146
except OSError as e:
149-
retried = False
150-
if not mode:
151-
if e.errno == errno.ESPIPE:
152-
st_mode = os.stat(filename).st_mode
153-
if stat.S_ISCHR(st_mode) or stat.S_ISFIFO(st_mode):
154-
# Python 3 can't open special files like
155-
# /dev/stdout in 'a' mode due to an implicit seek call
156-
# that fails with ESPIPE. Retry in 'w' mode.
157-
self.stream = open(filename, 'w')
158-
open_mode = 'w'
159-
retried = True
160-
if not retried:
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:
161155
raise
162156

163157
self.baseFilename = filename
164-
self.mode = open_mode
158+
self.mode = mode
165159

166160
def reopen(self):
167161
self.close()

0 commit comments

Comments
 (0)