Search code examples
pythonpython-2.7loggingargparse

How to set custom output handlers for argparse in Python?


I have configured logger to print both onto terminal stdout and to a file so I can have an archive of logging messages that I can refer to.

That is easily accomplished by adding a FileHandler to your logging object. Easy peasy.

What I want to accomplish now is to make argparse log also to the same file along with logs to stdout when it encounters parsing errors. So far it only prints to stdout. I looked in the argparse documentation but I can't find anything about setting a different output stream or pipe for argparse.

Is it possible to do? How?


Solution

  • Looking at the argparse.py source code there doesn't seem to be a way to configure this behaviour.

    My suggestion(s) would be to:

    • File a bug report with a patch :)

    Or override / patch it:

    • print_* method(s)
    • error method.

    The print_* method(s) seem to take an optional file argument which defaults to _sys.stdout.

    Update: Alternatively you could do something like this whereby you redirect sys.stdout temporarily while you parse arguments:

    from contextlib import contextmanager
    
    @contextmanager
    def redirect_stdout_stderr(stream):
        old_stdout = sys.stdout
        old_stderr = sys.stderr
        sys.stdout = stream
        sys.stderr = stream
        try:
            yield
        finally:
            sys.stdout = old_stdout
            sys.stderr = old_stderr
    
    
    with redirect_stdout_stderr(logstream):
        args = parser.parse_args()