By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,545 Members | 1,523 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,545 IT Pros & Developers. It's quick & easy.

An optparse question

P: n/a
T
I have a short program using optparse.OptionParser that prints out help
message with -h flag:

% myprog.py -h
usage: myprog.py [options] input_file

options:
-h, --help show this help message and exit
-v, --verbose print program's version number and exit
-o FILE Output file
My question is, is there a way to print a blank line (or any string)
before "usage: myprog.py [options] input_file" ? I tried using
callbacks without success. I think somehow I need to modify the
behavior of optparse.OptionParser.print_usage() function?

Jul 21 '06 #1
Share this Question
Share on Google+
8 Replies


P: n/a

T wrote:
I have a short program using optparse.OptionParser that prints out help
message with -h flag:

% myprog.py -h
usage: myprog.py [options] input_file

options:
-h, --help show this help message and exit
-v, --verbose print program's version number and exit
-o FILE Output file
My question is, is there a way to print a blank line (or any string)
before "usage: myprog.py [options] input_file" ? I tried using
callbacks without success. I think somehow I need to modify the
behavior of optparse.OptionParser.print_usage() function?
you can make the usage line anything you want.

....
usage = 'This is a line before the usage line\nusage %prog [options]
input_file'
parser = OptionsParser(usage=usage)
parser.print_help()
....

Jul 21 '06 #2

P: n/a
T
fuzzylollipop wrote:
>
you can make the usage line anything you want.

...
usage = 'This is a line before the usage line\nusage %prog [options]
input_file'
parser = OptionsParser(usage=usage)
parser.print_help()
...
No, that affects the string printed only *after* the "usage = " string.
What I would like to do is insert some string *before* the "usage = "
string, which is right after the command I type at the command prompt.
So I would like to make it look like this:

% myprog.py -h
************ THIS IS NEWLY INSERTED STRING ************
usage: myprog.py [options] input_file
options:
-h, --help show this help message and exit
-v, --verbose print program's version number and exit
-o FILE Output file

Jul 21 '06 #3

P: n/a
No, that affects the string printed only *after* the "usage = " string.
What I would like to do is insert some string *before* the "usage = "
string, which is right after the command I type at the command prompt.
So I would like to make it look like this:
The example was fine (except for a typo) as far as demonstrating the
concept. Try this corrected version:

from optparse import OptionParser

usage = '************ THIS IS NEWLY INSERTED STRING
************\nusage: %prog [options] input_file'
parser = OptionParser(usage=usage)
parser.print_help()

Jul 21 '06 #4

P: n/a
T wrote:
fuzzylollipop wrote:

you can make the usage line anything you want.

...
usage = 'This is a line before the usage line\nusage %prog [options]
input_file'
parser = OptionsParser(usage=usage)
parser.print_help()
...

No, that affects the string printed only *after* the "usage = " string.
What I would like to do is insert some string *before* the "usage = "
string, which is right after the command I type at the command prompt.
So I would like to make it look like this:

% myprog.py -h
************ THIS IS NEWLY INSERTED STRING ************
usage: myprog.py [options] input_file
options:
-h, --help show this help message and exit
-v, --verbose print program's version number and exit
-o FILE Output file
It's possible, but it ain't easy:

from optparse import OptionParser, _, IndentedHelpFormatter

class MyFormatter(IndentedHelpFormatter):
pre_usage = "Hi there!\n"
def format_usage(self, usage):
return _("%susage: %s\n") % (self.pre_usage, usage)

parser = OptionParser(formatter=MyFormatter())
The above filthy hack will print "Hi there!" before the usual usage
message.

Jul 21 '06 #5

P: n/a
dan.g...@gmail.com wrote:
No, that affects the string printed only *after* the "usage = " string.
What I would like to do is insert some string *before* the "usage = "
string, which is right after the command I type at the command prompt.
So I would like to make it look like this:

The example was fine (except for a typo) as far as demonstrating the
concept. Try this corrected version:

from optparse import OptionParser

usage = '************ THIS IS NEWLY INSERTED STRING
************\nusage: %prog [options] input_file'
parser = OptionParser(usage=usage)
parser.print_help()
Nope. That only *nearly* does what T wants. The usage message will
still be printed immediately *after* the 'usage: ' string.
>>parser = OptionParser(usage=usage)
parser.print_help()
usage: ************ THIS IS NEWLY INSERTED STRING************
usage: lopts.py [options] input_file

options:
-h, --help show this help message and exit
I had the same problem, and in order to get something printed before
the usage message, I found one easy-ish way was to subclass the
Formatter passed in to the Parser.

IMHO, optparse does a tricky task well, but it's implemented in a hard
to follow, inflexible manner. My "favorite" pet peeve is that the
options "dictionary" it returns isn't a dict. I wound up doing this to
it to get something [I considered] useful:

o, a = parser.parse_args()
o = o.__dict__.copy()
Peace,
~Simon

Jul 21 '06 #6

P: n/a
T wrote:
fuzzylollipop wrote:
>>you can make the usage line anything you want.

...
usage = 'This is a line before the usage line\nusage %prog [options]
input_file'
parser = OptionsParser(usage=usage)
parser.print_help()
...


No, that affects the string printed only *after* the "usage = " string.
What I would like to do is insert some string *before* the "usage = "
string, which is right after the command I type at the command prompt.
So I would like to make it look like this:

% myprog.py -h
************ THIS IS NEWLY INSERTED STRING ************
usage: myprog.py [options] input_file
options:
-h, --help show this help message and exit
-v, --verbose print program's version number and exit
-o FILE Output file
Do a Google search for "monkey patching". You probably want to
monkey-patch the class's usage method.

regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://holdenweb.blogspot.com
Recent Ramblings http://del.icio.us/steve.holden

Jul 21 '06 #7

P: n/a
Nope. That only *nearly* does what T wants. The usage message will
still be printed immediately *after* the 'usage: ' string.
>parser = OptionParser(usage=usage)
parser.print_help()
usage: ************ THIS IS NEWLY INSERTED STRING************
usage: lopts.py [options] input_file

options:
-h, --help show this help message and exit
Yes, I see what T meant now. Behavior expectations (assumptions) has a
way of clouding one's vision.

Thanks

Jul 21 '06 #8

P: n/a
"T" <ty*****@yahoo.comwrites:
[...]
What I would like to do is insert some string *before* the "usage = "
string, which is right after the command I type at the command prompt.
So I would like to make it look like this:

% myprog.py -h
************ THIS IS NEWLY INSERTED STRING ************
usage: myprog.py [options] input_file
options:
-h, --help show this help message and exit
-v, --verbose print program's version number and exit
-o FILE Output file
HelpFormatter is what you need. Seems undocumented in the official
docs, but doesn't look risky to use (famous last words). Seems just
that nobody got around to documenting it.

import optparse

class NonstandardHelpFormatter(optparse.HelpFormatter):

def __init__(self,
indent_increment=2,
max_help_position=24,
width=None,
short_first=1):
optparse.HelpFormatter.__init__(
self, indent_increment, max_help_position, width, short_first)

def format_usage(self, usage):
return "************ THIS IS NEWLY INSERTED STRING ************\nusage: %s\n" % usage

def format_heading(self, heading):
return "%*s%s:\n" % (self.current_indent, "", heading)

parser = optparse.OptionParser(
usage="%prog [options] input_file",
formatter=NonstandardHelpFormatter())
parser.parse_args()
John
Jul 21 '06 #9

This discussion thread is closed

Replies have been disabled for this discussion.