Connecting Tech Pros Worldwide Forums | Help | Site Map

getopt

Don Low
Guest
 
Posts: n/a
#1: Jul 18 '05
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(sys.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
Guest
 
Posts: n/a
#2: Jul 18 '05

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(sys.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(sys.argv[1:], 'ha:', \
['file=', 'view=', 'version', 'python-version'])


Peter
Alexander Schmolck
Guest
 
Posts: n/a
#3: Jul 18 '05

re: getopt


Don Low <m_tessier@sympatico.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
Mark Borgerding
Guest
 
Posts: n/a
#4: Jul 18 '05

re: getopt


Don Low wrote:
[color=blue]
> options, xarguments = getopt.getopt(sys.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(sys.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

Closed Thread