google / python-fire

Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.
Other
27.05k stars 1.44k forks source link

formatting_windows.initialize_or_disable breaks ansi escape codes #339

Open mkimberling opened 3 years ago

mkimberling commented 3 years ago

A recent modification added a call to SetConsoleMode that enables virtual terminal processing on Windows. This change prevents parent processes from receiving ANSI escape codes in the stdout of child processes. The only means to work around this, at the moment, is to comment out the call initialize_or_disable. In my opinion, modifying the console mode is outside of the scope and Fire and should not be happening

Below is a script that demonstrates the issue.

import fire, subprocess, sys

__color_names__ = ('red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white')

def print_with_colors():
    parts = []
    color_off = '\x1b[0m'
    for index, color_name in enumerate(__color_names__):
        color_on = '\x1b[{}m'.format(31+index)
        parts.append(f'{color_on}{color_name}{color_off}')
    print(' '.join(parts))

def test_case_1():
    """print with ansi colors in the current process"""
    print_with_colors()

def test_case_2():
    """print with ansi colors from sub process"""
    cmd = [sys.executable, sys.argv[0], 'print_with_colors']
    completed = subprocess.run(cmd, check=True, capture_output=True, text=True)
    print(completed.stdout)

if __name__ == '__main__':
    if len(sys.argv) == 1:
        test_case_1()
        test_case_2()
    else:
        fire.Fire()
dbieber commented 3 years ago

Thanks for the feedback. We (the developers of fire) aren't active Windows users, and we're certainly open to changing this behavior.