Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-112730: Use color to highlight error locations #112732

Merged
merged 10 commits into from
Dec 6, 2023
Merged

Conversation

pablogsal
Copy link
Member

@pablogsal pablogsal commented Dec 4, 2023

Doc/using/cmdline.rst Outdated Show resolved Hide resolved
@terryjreedy
Copy link
Member

On Windows in both CommandPrompt and PowerShell, 1/0 becomes ←[31m1←[0m←[1;31m/←[0m←[31m0←[0m in the traceback. They need to be switched to interpret the ANSI codes (possible, I believe) or treated as 'dumb', at least for this purpose.

@pablogsal
Copy link
Member Author

pablogsal commented Dec 5, 2023

On Windows in both CommandPrompt and PowerShell, 1/0 becomes ←[31m1←[0m←[1;31m/←[0m←[31m0←[0m in the traceback. They need to be switched to interpret the ANSI codes (possible, I believe) or treated as 'dumb', at least for this purpose.

Will investigate how to properly set this up for windows. I know the more modern Windows terminal (https://apps.microsoft.com/detail/9N0DX20HK701?hl=en-gb&gl=US) handles this correctly. We may need to deactivate this unless that new terminal is detected

@pablogsal
Copy link
Member Author

pablogsal commented Dec 5, 2023

I think for the start I will look at WT_SESSION as discussed here: microsoft/terminal#1040. More complicated solutions are possible (rich does this here but I don't want to start using ctypes and complications when printing exceptions, so i want to keep this dumb as possible).

We can iterate afterwards if someone want to add support to detecting other (working) environments.

Or maybe we can expose some C calls to windows and check for ENABLE_VIRTUAL_TERMINAL_PROCESSING....

@terryjreedy
Copy link
Member

According to https://en.wikipedia.org/wiki/Windows_Terminal, the first stable release of Windows Terminal was 18 days ago. It can run Command Prompt, Powershell, WSL Bash, and more. It is becoming default on Win 11 and can be installed on up-to-date Win 10. I will see if either an option 'cumulative update preview' or the next monthly update (in a week) installs it.

@aroberge
Copy link

aroberge commented Dec 5, 2023

Excellent idea. Based on my experience in trying to support this type of feature in various terminal themes for friendly-traceback, I think it would be helpful if the colors in

class _ANSIColors:
    RED = '\x1b[31m'
    BOLD_RED = '\x1b[1;31m'

could also be user-configurable via environment variables or some other method.

@pablogsal
Copy link
Member Author

Excellent idea. Based on my experience in trying to support this type of feature in various terminal themes for friendly-traceback, I think it would be helpful if the colors in

class _ANSIColors:
    RED = '\x1b[31m'
    BOLD_RED = '\x1b[1;31m'

could also be user-configurable via environment variables or some other method.

Thanks a lot for the suggestion. I will consider it, but for the first version, I am going to center on getting the defaults right for most environments and then we can iterate to improve the situation in different systems.

@pablogsal
Copy link
Member Author

@terryjreedy I have exposed a call to GetConsoleMode in the nt module and I am using that to check if the given terminal supports colors. Can you try to give it a go. Here are my local results:

powershell

powershell

windows terminal

windows_terminal

Signed-off-by: Pablo Galindo <[email protected]>
@pablogsal pablogsal force-pushed the gh-112730 branch 2 times, most recently from 58ce57a to 9ae4c77 Compare December 5, 2023 12:47
@hugovk
Copy link
Member

hugovk commented Dec 5, 2023

Some Python programs use https://github.com/tartley/colorama for colour, and some others do the colour themselves but still depend on colorama just to call their colorama.init() helper function to initialise Windows:

https://github.com/tartley/colorama#initialisation

You could check what that does, or their newer colorama.just_fix_windows_console(): https://github.com/tartley/colorama/blob/136808718af8b9583cb2eed1756ed6972eda4975/colorama/initialise.py#L72

@pablogsal
Copy link
Member Author

pablogsal commented Dec 5, 2023

Some Python programs use https://github.com/tartley/colorama for colour, and some others do the colour themselves but still depend on colorama just to call their colorama.init() helper function to initialise Windows:

That seems to wrap stderr and stdout to translate between ANSI and whatever windows uses. Given that this is critical code (we are printing errors) I don't want to mess with the standard streams not call complicated code.

Also, it is not clear to me what will happen if the interpreter does this wrapping and then something else does it on top (notice the only reason they claim is safe to call multiple times is because they record global state). As mentioned before, I want to leave this as dumb as possible and the current solution that detects if is possible to use ANSI sequences seems to work nicely to detect when is safe to do.

Edit:

Also seems that the future for Windows is the "Windows terminal" that supports this out of the box.

Signed-off-by: Pablo Galindo <[email protected]>
@terryjreedy
Copy link
Member

With fresh update, after "Fix multiline output", tracebacks look normal (b/w, not ansi) in Python started in CommandPrompt and in Windows Console (when started from icon or Explorer).

Doc/using/cmdline.rst Outdated Show resolved Hide resolved
@barneygale
Copy link
Contributor

Python-specific environment variables usually don't include underscores in their names (e.g. we have PYTHONWARNINGS, not PYTHON_WARNINGS). Should that apply here too, so the environment variable might be PYTHONCOLORS rather than PYTHON_COLORS?

@ambv
Copy link
Contributor

ambv commented Dec 6, 2023

@barneygale, if you look at the current makeup of PYTHON env variables, you'll notice we are currently changing this naming scheme. New variables have an underscore to improve readability. We leave old ones as is for backwards compatibility.

@ambv ambv merged commit 16448ca into python:main Dec 6, 2023
27 checks passed
@barneygale
Copy link
Contributor

Ah ha! Thanks :)

@pablogsal pablogsal deleted the gh-112730 branch December 6, 2023 22:31
aisk pushed a commit to aisk/cpython that referenced this pull request Feb 11, 2024
@@ -1118,7 +1203,7 @@ def __eq__(self, other):
def __str__(self):
return self._str

def format_exception_only(self, *, show_group=False, _depth=0):
def format_exception_only(self, *, show_group=False, _depth=0, **kwargs):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason to use **kwargs instead of *, colorlize=False?

Glyphack pushed a commit to Glyphack/cpython that referenced this pull request Sep 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants