getopt

D

Don Low

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?
 
P

Peter Otten

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

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

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
 
A

Alexander Schmolck

Don Low said:
Hi,

I'm going over a script that demonstrates the getopt function. I include
the script here: [...]
Can anyone explain this?

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
 
M

Mark Borgerding

Don said:
options, xarguments = getopt.getopt(sys.argv[1:], 'ha', \ [snip]
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



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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,989
Messages
2,570,207
Members
46,782
Latest member
ThomasGex

Latest Threads

Top