c...@zip.com.au writes: > My preferred pattern is like this: > > def main(argv): > try: > ... > except Exception as e: > logging.exception(e) > return 1 > > if __name__ == '__main__': > sys.exit(main(sys.argv)) > > Notice that main() is back to being a normal function with normal > returns.
That's good. A couple of points: * If you allow ‘main’ to be called with no arguments, and default to the actual command-line, then ‘main’ becomes a function you can use as a Setuptools entry point. * If the ‘main’ function encounters no exception, it will return ‘None’ instead of the correct exit status of 0. * You can use named constants from ‘os’ for the purpose of specifying exit status numbers. <URL:https://docs.python.org/3/library/os.html#os._exit> So:: def main(argv=None): """ Mainline procedure for this program. :param argv: Sequence of command-line arguments. Default: `sys.argv`. :return: Exit status (integer) for this program. """ exit_status = os.EX_OK if argv is None: argv = sys.argv try: ... except Exception as exc: logging.exception(exc) exit_status = os.EX_SOFTWARE return exit_status if __name__ == '__main__': sys.exit(main(sys.argv)) -- \ “He that would make his own liberty secure must guard even his | `\ enemy from oppression.” —Thomas Paine | _o__) | Ben Finney -- https://mail.python.org/mailman/listinfo/python-list