How to set custom output handlers for argparse in

2019-04-10 06:27发布

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?

2条回答
再贱就再见
2楼-- · 2019-04-10 07:15

There seems to be no way to do this through the API.

However, you can do the following:

class LoggingArgumentParser(argparse.ArgumentParser):
    """Custom ArgumentPaarser that overrides _print_message"""

    def _print_message(self, message, file=None):
        if message:
            logger.write(message)
查看更多
我命由我不由天
3楼-- · 2019-04-10 07:22

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

My suggestion(s) would be:

  • File a bug report with a patch :)

Override/patch:

  • 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 redirct_stdout_stderr(logstream):
    args = parser.parse_args()
查看更多
登录 后发表回答