#34768: Calling `colorama.init()` on module load can have unwanted side effects
-------------------------------------+-------------------------------------
Reporter: Charlie DeTar | Owner: nobody
Type: | Status: new
Cleanup/optimization |
Component: Core (Management | Version: 4.2
commands) |
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Charlie DeTar):
@LufafaJoshua passing `wrap=False` would solve my problem - but it would
likely break Django's usecase for windows, since it would then be
necessary for Django to write to `AnsiToWin32(sys.stdout).stream`
explicitly when it wants colorized output on windows. I believe the whole
reason for Django to use colorama at all is to keep colorized output on
windows consoles without having to explicitly switch or feature detect
them throughout the codebase.
Colorama's newer `colorama.just_fix_windows_console()` initializer (which
wasn't around when colorama was first added to Django) may be a better
fit. That will cause colorama to attempt to detect if the console it's
writing to is a windows console which does not support ANSI color
sequences, and wrap it only if that's the case. The caveat here is that
its detection may not be foolproof, so there could be edgecases for
particular windows console configurations that could lose colorized
output. In my not unbiased opinion, it'd be better to err on the side of
leaving `sys.stdout` alone, rather than erring on the side of always
replacing it (with the attendant edge case failures that can cause).
I managed to work around my issue by adding a `conftest.py` file with the
following hook to de-initialize colorama while pytest is loading, and
monkeypatch it to prevent subsequent initialization:
{{{
#!python
def pytest_configure():
"""
Hack to retain colorized output in pytest-xdist, working around this
bug:
https://code.djangoproject.com/ticket/34768
"""
try:
import colorama
# Undo any previously called colorama.init()
colorama.deinit()
# Prevent any future call to colorama.init() from having an effect
colorama.init = lambda: None
except ImportError:
pass
}}}
I imagine any edge-case windows console users whose configuration isn't
properly detected by `just_fix_windows_console()` could add a similar hack
(but in reverse) to force a call to `colorama.init()` instead if they
wished to restore colorized output. That, or open a ticket with colorama
to improve feature-detection of their configuration.
--
Ticket URL: <https://code.djangoproject.com/ticket/34768#comment:3>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/0107018a31812a64-09c9fcb2-6863-494c-a365-74a3a2f26fc0-000000%40eu-central-1.amazonses.com.