getopt

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Don Low

    getopt

    Hi,

    I'm going over a script that demonstrates the getopt function. I include
    the script here:


    #! /usr/bin/python

    import sys, getopt, string

    def help_message():
    print '''options.py -- uses getopt to recognize options
    Options: -h -- displays this help message
    -a -- expects an argument
    --file= -- expects an argument
    --view -- doesn't necessarily expect an argument
    --version -- displays Python version'''
    sys.exit(0)

    try:
    options, xarguments = getopt.getopt(s ys.argv[1:], 'ha', \
    ['file=', 'view=', 'version', 'python-version'])
    except getopt.error:
    print '''Error: You tried to use an unknown option or the
    argument for an option that requires it was missing. Try
    `options.py -h\' for more information.'''
    sys.exit(0)

    for a in options[:]:
    if a[0] == '-h':
    help_message()

    for a in options[:]:
    if a[0] == '-a' and a[1] != '':
    print a[0]+' = '+a[1]
    options.remove( a)
    break
    elif a[0] == '-a' and a[1] == '':
    print '-a expects an argument'
    sys.exit(0)

    for a in options[:]:
    if a[0] == '--file' and a[1] != '':
    print a[0]+' = '+a[1]
    options.remove( a)
    break
    elif a[0] == '--file' and a[1] == '':
    print '--file expects an argument'
    sys.exit(0)

    for a in options[:]:
    if a[0] == '--view' and a[1] != '':
    print a[0]+' = '+a[1]
    options.remove( a)
    break
    elif a[0] == '--view' and a[1] == '':
    print '--view doesn\'t necessarily expect an argument...'
    options.remove( a)
    sys.exit(0)

    for a in options[:]:
    if a[0] == '--version':
    print 'options version 0.0.001'
    sys.exit(0)

    for a in options[:]:
    if a[0] == '--python-version':
    print 'Python '+sys.version
    sys.exit(0)

    # END OF SCRIPT

    When I execute the script with the -a option or the --view option as in:

    ../script_name -a myarg

    It should report back:

    -a = myarg

    Instead it gives me:

    -a expects an argument

    This goes the same for the --file argument. The only one that works as
    it should is the --view argument, as in:

    ../help2.py --view=myarg
    --view = ssdt

    This is because an equal sign (=) has been appended to 'view' when
    getopt is called. If I add an equal sign to file (file=), it starts
    working as it should too.

    Can anyone explain this?

    --
    Thanks,

    Don
  • Peter Otten

    #2
    Re: getopt

    Don Low wrote:
    [color=blue]
    > I'm going over a script that demonstrates the getopt function. I include
    > the script here:[/color]

    I you are only now exploring the possibilities of getopt, you might want to
    leapfrog and use the more powerful optparse module.
    [color=blue]
    > options, xarguments = getopt.getopt(s ys.argv[1:], 'ha', \
    > ['file=', 'view=', 'version', 'python-version'])[/color]

    If you want the "a" option to require an argument, you have to append a
    colon serving the same purpose as the "=" for long options:

    options, xarguments = getopt.getopt(s ys.argv[1:], 'ha:', \
    ['file=', 'view=', 'version', 'python-version'])


    Peter

    Comment

    • Alexander Schmolck

      #3
      Re: getopt

      Don Low <m_tessier@symp atico.ca> writes:
      [color=blue]
      > Hi,
      >
      > I'm going over a script that demonstrates the getopt function. I include
      > the script here:[/color]
      [...][color=blue]
      > Can anyone explain this?[/color]

      Sorry for not answering your question, but can't you just use optparse (comes
      with python 2.3) or optik (same, but as downloadable library for older
      pythons)? It's much nicer.

      'as

      Comment

      • Mark Borgerding

        #4
        Re: getopt

        Don Low wrote:
        [color=blue]
        > options, xarguments = getopt.getopt(s ys.argv[1:], 'ha', \[/color]
        [snip][color=blue]
        > When I execute the script with the -a option or the --view option as in:
        >
        > ./script_name -a myarg
        >
        > It should report back:
        >
        > -a = myarg
        >[/color]



        The second argument should have a colon after any letter/option that
        takes an argument.


        Also, a useful trick is to cast the opts to a dict. This prevents the
        need for iterating over the opts and allows for concise definition of
        default arguments.

        e.g.


        opts,args = getopt.getopt(s ys.argv[1:] , 'h:a:v' )
        opts = dict(opts)

        hparm = opts.get('-h','cutie')
        aparm = float( opts.get( '-a', math.pi ) )
        verbose = opts.has_key('-v')


        Caveats: the dict trick does not allow an option to be specified more
        than once (e.g. -vv), it also loses ordering.


        - Mark

        Comment

        Working...