[source] a getopt for Windows

Thomas Heller theller at python.net
Tue May 20 14:13:12 EDT 2003


I had to parse Windows command lines with case insensitive flags like
/regserver or -RegServer and fund out that it's impossible to do this
with getopt.

Instead of learning optparse (and installting it under Python 2.2), I
came up with this module, which is hopefully usefull to other people as
well.

(IMO it's a typical Python module: roughly 1/3 docs, 1/3 code, and 1/3
unittest.)

Is this useful enough to be uploaded to the Cookbook? I'm not sure.

Thomas

-----<snip>-----
class GetoptError(Exception):
    pass

def w_getopt(args, options):
    """A getopt for Windows.

    Options may start with either '-' or '/', the option names may
    have more than one letter (/tlb or -RegServer), and option names
    are case insensitive.

    Returns two elements, just as getopt.getopt.  The first is a list
    of (option, value) pairs in the same way getopt.getopt does, but
    there is no '-' or '/' prefix to the option name, and the option
    name is always lower case.  The second is the list of arguments
    which do not belong to an option.

    Different from getopt.getopt, a single argument not belonging to an option
    does not terminate parsing.
    """
    opts = []
    arguments = []
    while args:
        if args[0][:1] in "/-":
            arg = args[0][1:] # strip the '-' or '/'
            arg = arg.lower()

            if arg + ':' in options:
                try:
                    opts.append((arg, args[1]))
                except IndexError:
                    raise GetoptError, "option '%s' requires an argument" % args[0]
                args = args[1:]
            elif arg in options:
                opts.append((arg, ''))
            else:
                raise GetoptError, "invalid option '%s'" % args[0]
            args = args[1:]
        else:
            arguments.append(args[0])
            args = args[1:]

    return opts, arguments

if __name__ == "__main__":
    import unittest

    class TestCase(unittest.TestCase):
        def test_1(self):
            args = "-embedding spam /RegServer foo /UnregSERVER blabla".split()
            opts, args = w_getopt(args,
                                  "regserver unregserver embedding".split())
            self.assertEqual(opts,
                             [('embedding', ''),
                              ('regserver', ''),
                              ('unregserver', '')])
            self.assertEqual(args, ["spam", "foo", "blabla"])

        def test_2(self):
            args = "/TLB Hello.Tlb HELLO.idl".split()
            opts, args = w_getopt(args, ["tlb:"])
            self.assertEqual(opts, [('tlb', 'Hello.Tlb')])
            self.assertEqual(args, ['HELLO.idl'])

        def test_3(self):
            # Invalid option
            self.assertRaises(GetoptError, w_getopt,
                              "/TLIB hello.tlb hello.idl".split(), ["tlb:"])

        def test_4(self):
            # Missing argument
            self.assertRaises(GetoptError, w_getopt,
                              "/TLB".split(), ["tlb:"])

    unittest.main()
-----<snip>-----




More information about the Python-list mailing list