#34768: Calling `colorama.init()` on module load can have unwanted side effects -------------------------------------+------------------------------------- Reporter: Charlie | Owner: nobody DeTar | Type: | Status: new Uncategorized | Component: Core | Version: 4.2 (Management commands) | Severity: Normal | Keywords: Triage Stage: | Has patch: 0 Unreviewed | Needs documentation: 0 | Needs tests: 0 Patch needs improvement: 0 | Easy pickings: 0 UI/UX: 0 | -------------------------------------+------------------------------------- `django.core.management.color` calls [https://github.com/django/django/blob/aa3cb3f37265be37d892e2b391ff023e9caee2a4/django/core/management/color.py#L12-L14 `colorama.init()`] on module load if the module is present in the system. This causes `sys.stdout` to be replaced by an instance of `colorama.ansitowin32.StreamWrapper`.
This, in turn, can cause problems in other contexts that do not expect `sys.stdout` to be a colorama wrapper. For example, using `pytest` with `pytest-xdist` in `--looponfail` mode (which uses [https://pypi.org/project/execnet/ execnet] to further wrap its output) results in ansi color escapes getting dropped from the output. In discussion of #32740, a maintainer commented "There's no reason to have colorama installed at all if you're not on windows". However, colorama now [https://github.com/tartley/colorama describes itself] as providing a "simple cross-platform API for printing colored terminal text from Python"; and indeed, [https://github.com/Riverside-Healthcare/djlint djlint] installs colorama as a dependency for all platforms, using other color utilities within the project rather than the stream wrapper. In short: it is probably not right to assume that `colorama` will only be present on win32, and thus Django probably shouldn't be replacing `sys.stdout` with it on module import without at a platform check. To summarize: a linux environment which installs: - Django v3.2 -> dev - djlint v1.32.x - pytest-xdist v3.3.x will lose colorized output while running `pytest` with `--looponfail` due to Django's call to `colorama.init()`, which is an unnecessary call on that platform. -- Ticket URL: <https://code.djangoproject.com/ticket/34768> 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 django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/01070189d69848e4-996d71cd-2cd1-40a3-822d-6dfb443c2f19-000000%40eu-central-1.amazonses.com.