def automain(argv=None, verbose=False, breakin=False, ultraTB=False, pdb=False, timemsg=False, available=None, mod=None, main_only=False): """ Automatically create a very simple command-line interface. Note: All functions must take string arguments """ if not mod: import __main__ as mod argv = argv or sys.argv try: if breakin: from debug import breakin breakin.enable() if ultraTB: from debug import ultraTB2 ultraTB2.enable(include_vars=False) if pdb: from debug.utils import enable_debug_hook enable_debug_hook() if timemsg: from humanreadable import print_elapsed_time print_elapsed_time() except ImportError: pass if available: filterfn = None else: def filterfn(obj): try: if not obj.__module__ == '__main__' and main_only: return False if not hasattr(obj, '__call__'): return False except AttributeError: return False else: name = obj.__name__ return name not in ('automain', 'usage', 'call_signature') and not name.startswith('_') available = dir(mod) objects = [getattr(mod, x) if isinstance(x, basestring) else x for x in available] objects = list(sorted(filter(filterfn, objects), key=lambda x: x.__name__)) # should we print the module's docstring in the help? def show_help(objects): print for obj in objects: print usage(obj) print try: action = getattr(mod, argv[1]) assert hasattr(action, '__call__') except (IndexError, AttributeError, AssertionError): show_help(objects) else: args = list(argv[2:]) parser = OptionParser() #parser.allow_interspersed_args = False spec = getargspec(action) if spec.defaults: for default, arg in zip(reversed(spec.defaults), reversed(spec.args)): # args with default values longname = '--' + arg #if isinstance(default, bool): # XXX: this not the right semantics. # if default == False: # parser.add_option(longname, action="store_true", default=False) # else: # parser.add_option(longname, action="store_false", default=True) #else: parser.add_option(longname, default=default) parser.usage = '%s [options] %s' % (action.__name__, ' '.join(spec.args)) \ + '\n\n ' + getdoc(action) (kw, args) = parser.parse_args(args) # TODO: need a better usage message which shows positional arguments # minimum non-keyword args if len(args) < len(spec.args) - len(spec.defaults or []): parser.print_help() return kw = kw.__dict__ # call function out = action(*args, **kw) # pretty-print result if isinstance(out, basestring): print out elif isinstance(out, dict): if isinstance(out, defaultdict): out = dict(out) pprint(out) else: try: out = iter(out) except TypeError: if out is not None: print out else: for x in out: print x
parser.add_option('-a', '--automain', action="store_true", default=False) parser.add_option('--less-verbose', action="store_true", default=False) # split the argument list at the first item ending with .py source = [(i + 1, f) for i, f in enumerate(sys.argv[1:]) if f.endswith('.py')] devargs = sys.argv[:source[0][0]] scriptargs = sys.argv[source[0][0]:] #print 'devargs:', devargs #print 'scriptargs:', scriptargs (opts, args) = parser.parse_args(devargs) if opts.less_verbose: ultraTB2.enable(include_vars=False) else: ultraTB2.enable() # hack sys.argv so that it no longer contains this script's options sys.argv = scriptargs if opts.coverage: from coverage import coverage cov = coverage(data_suffix=True, branch=True) cov.start() if opts.doctest or opts.verbose_doctest or opts.doctest_for is not None: import doctest, atexit if opts.doctest_for is not None: # XXX: not sure how useful this is print 'running doctest for %s only' % opts.doctest_for
parser.add_option('-a','--automain', action="store_true", default=False) parser.add_option('--less-verbose', action="store_true", default=False) # split the argument list at the first item ending with .py source = [(i+1,f) for i, f in enumerate(sys.argv[1:]) if f.endswith('.py')] devargs = sys.argv[:source[0][0]] scriptargs = sys.argv[source[0][0]:] #print 'devargs:', devargs #print 'scriptargs:', scriptargs (opts, args) = parser.parse_args(devargs) if opts.less_verbose: ultraTB2.enable(include_vars=False) else: ultraTB2.enable() # hack sys.argv so that it no longer contains this script's options sys.argv = scriptargs if opts.coverage: from coverage import coverage cov = coverage(data_suffix=True, branch=True) cov.start() if opts.doctest or opts.verbose_doctest or opts.doctest_for is not None: import doctest, atexit if opts.doctest_for is not None: # XXX: not sure how useful this is print 'running doctest for %s only' % opts.doctest_for
def automain(argv=None, verbose=False, breakin=False, ultraTB=False, pdb=False, timemsg=False, available=None): """ Automatically create a very simple command-line interface. Note: All functions must take string arguments """ import __main__ as mod argv = argv or sys.argv try: if breakin: from debug import breakin breakin.enable() if ultraTB: from debug import ultraTB2 ultraTB2.enable(include_vars=False) if pdb: from debug.utils import enable_debug_hook enable_debug_hook() if timemsg: from humanreadable import print_elapsed_time print_elapsed_time() except ImportError: pass if available: filterfn = None else: def filterfn(obj): try: if not obj.__module__ == '__main__': return False if not hasattr(obj, '__call__'): return False except AttributeError: return False else: name = obj.__name__ return name not in ('automain', 'usage', 'call_signature' ) and not name.startswith('_') available = dir(mod) objects = [ getattr(mod, x) if isinstance(x, basestring) else x for x in available ] objects = list(sorted(filter(filterfn, objects), key=lambda x: x.__name__)) # should we print the module's docstring in the help? def show_help(objects): print for obj in objects: print usage(obj) print try: action = getattr(mod, argv[1]) assert hasattr(action, '__call__') except (IndexError, AttributeError, AssertionError): show_help(objects) else: args = list(argv[2:]) parser = OptionParser() #parser.allow_interspersed_args = False spec = getargspec(action) if spec.defaults: for default, arg in zip(reversed(spec.defaults), reversed( spec.args)): # args with default values longname = '--' + arg #if isinstance(default, bool): # XXX: this not the right semantics. # if default == False: # parser.add_option(longname, action="store_true", default=False) # else: # parser.add_option(longname, action="store_false", default=True) #else: parser.add_option(longname, default=default) parser.usage = '%s [options] %s' % (action.__name__, ' '.join(spec.args)) \ + '\n\n ' + getdoc(action) (kw, args) = parser.parse_args(args) # TODO: need a better usage message which shows positional arguments # minimum non-keyword args if len(args) < len(spec.args) - len(spec.defaults or []): parser.print_help() return kw = kw.__dict__ # call function out = action(*args, **kw) # pretty-print result if isinstance(out, basestring): print out elif isinstance(out, dict): if isinstance(out, defaultdict): out = dict(out) pprint(out) else: try: out = iter(out) except TypeError: if out is not None: print out else: for x in out: print x