from argparse import ArgumentParser, SUPPRESS, REMAINDER import sys print( sys.version ) optparser = ArgumentParser() optparser.add_argument('--foo', dest='foo') optparser.add_argument('--bar', dest='bar') posparser = ArgumentParser() # posparser.add_argument('baz', nargs='*') kw = { 'opt': optparser, 'pos': posparser } def optparse( *args, **kwargs ): optparser = kwargs['opt'] posparser = kwargs['pos'] ns, remain = optparser.parse_known_args( *args ) ns = posparser.parse_args( remain, ns ) return ns print( optparse('a b c d --foo x --bar 1'.split(), **kw )) print( optparse('--foo x a b c d --bar 1'.split(), **kw )) print( optparse('--foo x --bar 1 a b c d'.split(), **kw )) print( optparse('a b --foo x --bar 1 c d'.split(), **kw )) # expected: Namespace(bar='1', baz=['a', 'b', 'c', 'd'], foo='x') # actual: error: unrecognized arguments: c d