logging.FileHandler diff Py2 v Py3

Peter Otten __peter__ at web.de
Tue Apr 3 12:54:15 EDT 2018


Skip Montanaro wrote:

> I've encountered a problem in an application I'm porting from Python
> 2.7 to 3.6. The logginng.FileHandler class likes "/dev/stderr" as a
> destination in Python 2, but complains in Python 3.
> 
> Python 2.7.14:
> 
>>>> import logging
>>>> logging.FileHandler("/dev/stderr")
> <logging.FileHandler object at 0x7fbbba9bbdd0>
> 
> Python 3.6.4:
> 
>>>> import logging
>>>> logging.FileHandler("/dev/stderr")
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File
>   "/home/skip/miniconda3/envs/python3/lib/python3.6/logging/__init__.py",
> line 1030, in __init__
>     StreamHandler.__init__(self, self._open())
>   File
>   "/home/skip/miniconda3/envs/python3/lib/python3.6/logging/__init__.py",
> line 1059, in _open
>     return open(self.baseFilename, self.mode, encoding=self.encoding)
> OSError: [Errno 29] Illegal seek
> 
> I can see how to work around the error, pass mode="w" when passing
> /dev/{stdout,stderr} to the constructor. Shouldn't that bit of
> ugliness be hidden in the logging module?

I think the culprit is io.open() rather than the logging module. Why does

>>> io.open("/dev/stderr", "a")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 29] Illegal seek

even try to seek()?



More information about the Python-list mailing list