You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(11) |
Dec
(17) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(12) |
Feb
(12) |
Mar
(1) |
Apr
(9) |
May
(1) |
Jun
(39) |
Jul
(12) |
Aug
(7) |
Sep
(2) |
Oct
(4) |
Nov
(15) |
Dec
(10) |
2003 |
Jan
(2) |
Feb
(3) |
Mar
(1) |
Apr
(4) |
May
(13) |
Jun
(11) |
Jul
|
Aug
(4) |
Sep
(13) |
Oct
(2) |
Nov
(2) |
Dec
(3) |
2004 |
Jan
(1) |
Feb
(2) |
Mar
(2) |
Apr
(4) |
May
(25) |
Jun
(14) |
Jul
(21) |
Aug
(7) |
Sep
(25) |
Oct
(19) |
Nov
(15) |
Dec
(2) |
2005 |
Jan
(1) |
Feb
(1) |
Mar
(20) |
Apr
(1) |
May
(2) |
Jun
|
Jul
(3) |
Aug
(2) |
Sep
|
Oct
|
Nov
(1) |
Dec
(6) |
2006 |
Jan
(2) |
Feb
|
Mar
(1) |
Apr
(7) |
May
(5) |
Jun
(3) |
Jul
(1) |
Aug
(4) |
Sep
|
Oct
(3) |
Nov
(1) |
Dec
|
2007 |
Jan
|
Feb
|
Mar
(2) |
Apr
(1) |
May
|
Jun
(5) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
(2) |
2008 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
(5) |
Jul
(3) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(2) |
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Alan M. <am...@ya...> - 2009-11-06 04:03:34
|
I posted a message about the above topic today, got wound up in writing it, and forgot to put in a subject line. I apologize for the oversight. -- Alan Meyer am...@ya... |
From: Alan M. <am...@ya...> - 2009-11-06 02:04:11
|
I would like to propose an easy enhancement to the description formatting in optparse. I found ways to do what I want to do here: http://groups.google.com/group/comp.lang.python/browse_frm/thread/e72deee779d9989b/ but the approach looks complex and a little fragile. The enhancement I'm proposing is to allow a programmer to specify an OptionParser.description that is already formatted, i.e., that will be displayed without passing it through textwrap.fill(), which is what now happens. The particular use case that prompted me to request this enhancement is that I wanted to document the fixed arguments, each on a separate line, for example: ... parser = optparse.OptionParser( usage = "%prog {options} fratzer coord", description = """ This program fibrillates the umptifratz using specialized fratzer and coordinate settings passed on the command line. args: fratzer = One of the three system fratzers: "tan" - take the tangent to the fratzline "sin" - use the sine of the fratzline "cos" - use the cosine of the fratzline coord = Coordinate system to use, one of: "rectilinear" "polar" """) ... I solved the problem in my program by stuffing the preformatted text into the usage message (which is not passed through textwrap.fill), but would like to be able to put it in the description instead so that it's closer to where the option documentation is displayed and only appears when fuller help is requested. One way to get what I want is to do what the poster to comp.lang.python did and override the help formatter. However, a much simpler way to enable someone to get what he wants is just to provide an option for turning off formatting altogether and allowing a user to provide preformatted text. For example, we might add a new attribute to the OptionParser such as "reformat_description", with a default value of True. Then check the value later: def format_description(self, formatter): if self.parser.reformat_description: return formatter.format_description(self.get_description()) else: return self.get_description() That could be added to the source for optparse in minutes, provides total flexibility while maintaining complete backward compatibility, and offers a trivially easy path for the programmer to getting a formatted description. Thank you for producing such a powerful and useful module. -- Alan Meyer am...@ya... |
From: David G. <go...@py...> - 2008-07-03 19:07:44
|
On Thu, Jul 3, 2008 at 14:41, Scott Stagg <ss...@ma...> wrote: > I am trying to write a function that will use an OptionParser object > to generate a help file. Ultimately, I will have it generate an HTML > file so the help doc for my program can be viewed from the web. The > problem I'm having is that I can't figure out how to have > OptionParser return a list of the names of the options I have > defined and the corresponding help information. Does anyone have a > suggestion on how I could do this? No, but I have an alternative. Use "formatter=optparse.TitledHelpFormatter" and run the resulting help text through Docutils to get your HTML. -- David Goodger <http://python.net/~goodger> |
From: <Gre...@ao...> - 2008-07-03 19:05:28
|
opt...@li... wrote on 07/03/2008 01:41:23 PM: > Hi all, > I am trying to write a function that will use an OptionParser > object to generate a help file. Ultimately, I will have it generate > an HTML file so the help doc for my program can be viewed from the > web. The problem I'm having is that I can't figure out how to have > OptionParser return a list of the names of the options I have > defined and the corresponding help information. Does anyone have a > suggestion on how I could do this? > if you load up something like ipython and dig into your parser you can pull out the options. if p is your parser, you can look at the items in p.option_list, they will have ._long_opts, ._short_opts, .dest, and .help attributes (as well as a handful of others). But if you already have your parser generated the quickest way is to directly call the p.format_help() method, which would be the same as calling the help switch for the application at the cli. -greg |
From: Scott S. <ss...@ma...> - 2008-07-03 18:41:16
|
Hi all, I am trying to write a function that will use an OptionParser object to generate a help file. Ultimately, I will have it generate an HTML file so the help doc for my program can be viewed from the web. The problem I'm having is that I can't figure out how to have OptionParser return a list of the names of the options I have defined and the corresponding help information. Does anyone have a suggestion on how I could do this? Thanks, Scott |
From: <Gre...@ao...> - 2008-06-27 17:10:59
|
opt...@li... wrote on 06/27/2008 12:04:31 PM: > On Fri, Jun 27, 2008 at 12:31, <Gre...@ao...> wrote: > > dgo...@gm... wrote on 06/27/2008 09:26:47 AM: > > > >> On Thu, Jun 26, 2008 at 20:17, <Gre...@ao...> wrote: > >> > So after reading through the docs and looking in the code a bit (gotta > > love > >> > open source), it occurred to me that it might be a "nice" feature to be > >> > able to provide multiple callbacks per option. > >> > >> This is easy to do from your own code. Just define a closure function: > >> > >> def multiple_callbacks(*callbacks): > >> """Returns a callback that calls multiple callbacks.""" > >> def call_multiple_callbacks(option, opt, value, parser): > >> for callback in callbacks: > >> callback(option, opt, value, parser) > >> return call_multiple_callbacks > >> > >> OPTIONS_LIST = [ > >> make_option('-c', '--chroot', default=None, > >> action='callback', > >> callback=multiple_callbacks(check_path_exists, check_path_isdir), > >> help="specifies the root of the chroot environment to work with"), > >> ... > > > > Nice. I like that.. and I will probably use that. Thank you. So, do this > > not seem like it would be a valuable function to have in optik? > > I have never felt the need for it, and have never heard of anyone > needing it before now. I've been using optparse for well over a year now and never even thought to start using callbacks until yesterday. Most of the code I've seen (admittedly probably a very small portion of the actual code people have written with optik/optparse) doesn't use them. So I guess it makes a difference on whether people were using the code that is in place already or re-creating the wheel unknowingly. But I concede the point especially based on the next statement. > In any case, I don't know if this is a useful forum for discussions of > Optik's development any more. It seems like Optik's author, Greg Ward, > has lost interest in it. It is only being maintained in Python's > standard library as optparse.py. Hrm.. well, such is life. At least it is being maintained. Thanks for your time an input. That function is very handy and will find its way into most of my code. -Greg |
From: David G. <go...@py...> - 2008-06-27 17:04:23
|
On Fri, Jun 27, 2008 at 12:31, <Gre...@ao...> wrote: > dgo...@gm... wrote on 06/27/2008 09:26:47 AM: > >> On Thu, Jun 26, 2008 at 20:17, <Gre...@ao...> wrote: >> > So after reading through the docs and looking in the code a bit (gotta > love >> > open source), it occurred to me that it might be a "nice" feature to be >> > able to provide multiple callbacks per option. >> >> This is easy to do from your own code. Just define a closure function: >> >> def multiple_callbacks(*callbacks): >> """Returns a callback that calls multiple callbacks.""" >> def call_multiple_callbacks(option, opt, value, parser): >> for callback in callbacks: >> callback(option, opt, value, parser) >> return call_multiple_callbacks >> >> OPTIONS_LIST = [ >> make_option('-c', '--chroot', default=None, >> action='callback', >> callback=multiple_callbacks(check_path_exists, check_path_isdir), >> help="specifies the root of the chroot environment to work with"), >> ... > > Nice. I like that.. and I will probably use that. Thank you. So, do this > not seem like it would be a valuable function to have in optik? I have never felt the need for it, and have never heard of anyone needing it before now. In any case, I don't know if this is a useful forum for discussions of Optik's development any more. It seems like Optik's author, Greg Ward, has lost interest in it. It is only being maintained in Python's standard library as optparse.py. -- David Goodger <http://python.net/~goodger> |
From: <Gre...@ao...> - 2008-06-27 16:31:39
|
dgo...@gm... wrote on 06/27/2008 09:26:47 AM: > On Thu, Jun 26, 2008 at 20:17, <Gre...@ao...> wrote: > > So after reading through the docs and looking in the code a bit (gotta love > > open source), it occurred to me that it might be a "nice" feature to be > > able to provide multiple callbacks per option. > > This is easy to do from your own code. Just define a closure function: > > def multiple_callbacks(*callbacks): > """Returns a callback that calls multiple callbacks.""" > def call_multiple_callbacks(option, opt, value, parser): > for callback in callbacks: > callback(option, opt, value, parser) > return call_multiple_callbacks > > OPTIONS_LIST = [ > make_option('-c', '--chroot', default=None, > action='callback', > callback=multiple_callbacks(check_path_exists, check_path_isdir), > help="specifies the root of the chroot environment to work with"), > ... > Nice. I like that.. and I will probably use that. Thank you. So, do this not seem like it would be a valuable function to have in optik? -greg |
From: David G. <go...@py...> - 2008-06-27 14:26:39
|
On Thu, Jun 26, 2008 at 20:17, <Gre...@ao...> wrote: > So after reading through the docs and looking in the code a bit (gotta love > open source), it occurred to me that it might be a "nice" feature to be > able to provide multiple callbacks per option. This is easy to do from your own code. Just define a closure function: def multiple_callbacks(*callbacks): """Returns a callback that calls multiple callbacks.""" def call_multiple_callbacks(option, opt, value, parser): for callback in callbacks: callback(option, opt, value, parser) return call_multiple_callbacks OPTIONS_LIST = [ make_option('-c', '--chroot', default=None, action='callback', callback=multiple_callbacks(check_path_exists, check_path_isdir), help="specifies the root of the chroot environment to work with"), ... -- David Goodger <http://python.net/~goodger> |
From: <Gre...@ao...> - 2008-06-27 00:17:43
|
Hi. So I had come up with my own way of parsing through options and determining what was good and what needed to be errored. No big deal. Had a thought that it would be kewl to extend Options to handle this automagically, and then it occurred to me that I should probably re-check the documentation. Apparently I stopped reading it before I got to the good bits (ain't that always the case?). So after reading through the docs and looking in the code a bit (gotta love open source), it occurred to me that it might be a "nice" feature to be able to provide multiple callbacks per option. Here is a use case: I have 3 options that I want the user to provide. 2 directories and 1 file. I want to verify that the directories both exist, and are actually directories. I want 1 directory to be an absolute path and also writeable. I want to also verify that the file exists and is writeable. I've written 4 callbacks that could handle that, without repeating code, but only if I could pass multiple functions through callback. ie: #!/usr/bin/env python from optparse import make_options, OptionParser, OptionValueError import os OPTIONS_LIST = [ make_option('-c', '--chroot', default=None, action='callback', callback=(check_path_exists, check_path_isdir), help="specifies the root of the chroot environment to work with"), make_option('-w', '--working', default=None, action='callback', callback=(check_path_exists, check_path_isdir, check_writeable), help="specifies the working directory"), make_option('-o', '--output', default=None, action='callback', callback=(check_path_exists, check_writeable), help="specifies the file to save the output to"), make_option('-d', '--debug', action="store_true", default=False, help="enable debugging") ] def check_path_exists(option, opt_str, value, parser): if (not os.path.exists(value)): raise OptionValueError('Specified %s path does not exist' % (opt_str)) setattr(parser.values, option.dest, value) def check_path_isdir(option, opt_str, value, parser): if (not os.path.isdir(value)): raise OptionValueError('Specified %s path is not a directory' % (opt_str)) setattr(parser.values, option.dest, value) def check_abspath(option, opt_str, value, parser): if (not options.working.startswith("/")): raise OptionValueError("Specified directory must reference an absolute path") setattr(parser.values, option.dest, value) def check_writable(option, opt_str, value, parser): if (not os.access(options.output, os.W_OK)): raise OptionValueError('Cannot write to location provided') setattr(parser.values, option.dest, value) p = OptionParser(OPTION_LIST) (options, args) = p.parse_args() ######### End script This of course doesn't work at this point.... but a simple modification to 2 spots inside the {optik,optparse}.py such as this: Make this change in Option._check_callback (approx line704) Before: def _check_callback(self): if self.action == "callback": if not callable(self.callback): raise OptionError( "callback not callable: %r" % self.callback, self) After: def _check_callback(self): if self.action == "callback": if type(self.callback) is not types.TupleType: self.callback = (self.callback,) for cb in self.callback: if not callable(cb): raise OptionError( "callback not callable: %r" % cb, self) Then in Option.take_action (approx line 804): Before: elif action == "callback": args = self.callback_args or () kwargs = self.callback_kwargs or {} self.callback(self, opt, value, parser, *args, **kwargs) After: elif action == "callback": args = self.callback_args or () kwargs = self.callback_kwargs or {} for cb in self.callback: cb(self, opt, value, parser, *args, **kwargs) Anyways... just a thought. There is probably more to the change (and I'm sure a unittest would have to probably be made/adjusted) but I just wanted to throw it out there. -greg |
From: Mark E. H. <mh...@sa...> - 2008-02-20 16:26:35
|
Alec Solway wrote: > Is there a way to have optparse ignore unrecognized options instead of > bailing out? If it did then you couldn't tell if the user passed an invalid option. However, a little testing shows that optparse does correctly handle the standard '--' option, which means to stop processing options at that point. Everything following that option is assumed to be a parameter, and will be placed in the args element of the tuple returned by parse_args(). So, for instance, with something like this: #!/bin/env python import optparse p = optparse.OptionParser() p.add_option("-t", action="append", type="string", dest="test") opt, args = p.parse_args() print 'opt :', opt print 'args:', args Would fail (as it should) if '-a' was passed before '--' sahp7635% ./test2.py -a usage: test2.py [options] test2.py: error: no such option: -a or would produce this if it was passed after. sahp7635% ./test2.py arg -- -a opt : {'test': None} args: ['arg', '-a'] or this (with a more fully populated command line.) sahp7635% ./test2.py -t something -- param -a opt : {'test': ['something']} args: ['param', '-a'] -- ---------------- Mark E. Hamilton Orion International Technologies, Inc. Sandia National Laboratory, NM. 505-844-7666 |
From: Alec S. <as...@se...> - 2008-02-20 15:31:29
|
Is there a way to have optparse ignore unrecognized options instead of bailing out? |
From: Tobias H. <Tob...@gm...> - 2007-12-29 10:44:44
|
Alexy Khrabrov schrieb: > I wonder how do you implement optional arguments to Optik. I.e., you > can have an option > > -P [file] > > ... > > How do we do optional values in Optik, with nargs <= 1? I reckon you need to use a callback function; but sorry, I didn't do something like that yet... > Another question I have it how can I output a docstring right from > the parser.add_option() block? I prefer to define all option-related > things in the same block once. I'd like to output the help value >>from the block, or append it to a report. I'm not sure what you mean. You could put the string in a variable which you use in the add_option(..., help='bla...') argument. Hth, -- Tobias |
From: Tobias H. <Tob...@gm...> - 2007-12-29 10:36:18
|
Hi, I use optparse for a while now (on Windows) and always wondered why the "Options:" string in the help output isn't localised; I had a look in my Python installation and couldn't find any optparse.mo (or .po, or .pot, IIRC) file. I installed optik 1.5.3, but no optik.mo, either. I'd happiliy provide a german translation, but I'm not very familiar with the string extraction tools etc. which are available mainly for Linux... Cheers, -- Tobias |
From: Alexy K. <del...@gm...> - 2007-11-01 23:14:09
|
I wonder how do you implement optional arguments to Optik. I.e., you can have an option -P [file] -- the filename is optional, with a default "data,pikl". It works as follows: -- if no -P is given, no pickle is written -- if -P is given without the filename following, a pickle file is written with the default name data.pikl -- if -P filename is given, the pickle is written to filename How do we do optional values in Optik, with nargs <= 1? Another question I have it how can I output a docstring right from the parser.add_option() block? I prefer to define all option-related things in the same block once. I'd like to output the help value from the block, or append it to a report. Here's example from my Ruby wrapper for Ruby's optparse: name = :divisor help = "show divisor" short = "-m" opt.on(short, "--#{name} [STR]", help) do |val| hash[:show_divisor] = true hash[:divisor] = val if val end report << [name,short,help] -- notice that my report list is built with the exact values of all options, regardless of whether they're encountered or not. The I simply walk through the report list to print a report for this run: report.each do |name,short,help| val = opts.name || "----" STDERR.printf "--%s (%s)\t\%s\t%s\n", o, short, val, help end if verbose How can I group such reporting together with add_option in Optik? Cheers, Alexy |
From: Stephen K. <su...@gm...> - 2007-07-31 21:56:39
|
Some people still want man pages and I can't be bothered keeping one up to date. A couple of blocks of text and an populated option parser could generate a pretty good manpage though. Has anybody done this? Stephen. |
From: Joe F. <pen...@gm...> - 2007-06-20 18:11:47
|
And so the drama for one ends :-) I was able to resolve my bug after a good rest and some further digging into the optparse module. I chased the bug through the module and it ran back into my callback function. On 6/19/07, Joe Friedrichsen <pen...@gm...> wrote: > > I changed the -c, -p, and -a options to action=callback and > callback=variable_args, and the parser broke again. When execution > enters my callback function, option.dest is _always_ the same. The > correct option is not being passed. How can I fix it? By not using the same variable name for different things. I used (and thereby re-set) the variable 'option' when finding the parser's options. By changing the variable name used in the for loop to 'opt', option.dest remained the correct destination. Thanks for your patience, Joe The now bug-free code (with intelligent variable-length argument parsing): def variable_args(option, opt_str, value, parser): """Parse options that have a variable number of arguments """ assert value is None value = [] rargs = parser.rargs # Group all of the parser's options all_options = [] for opt in parser.option_list: all_options = all_options + opt._short_opts + opt._long_opts while rargs: arg = rargs[0] # Stop if we hit an arg in the parser if arg in all_options: break else: value.append(arg) del rargs[0] setattr(parser.values, option.dest, value) |
From: Joe F. <pen...@gm...> - 2007-06-20 05:13:50
|
On 6/19/07, Joe Friedrichsen <pen...@gm...> wrote: > > If anyone has any ideas about why this is happening, please tell me. > Now that I have the behavior that I want, I'll be changing the -c, -p, > and -a options to this same callback function, so I hope the parser > can keep up :-) Looks like it couldn't. The parser isn't updating the option object when it calls the callback function: it's stuck on whichever option was added last. I changed the -c, -p, and -a options to action=callback and callback=variable_args, and the parser broke again. When execution enters my callback function, option.dest is _always_ the same. The correct option is not being passed. How can I fix it? I've included the updated code and console output again. I added the -a option last, and each time variable_args is triggered, option.dest is 'authors' and does not correspond to the option that triggered it. Thanks, Joe ######### ######### Code ######### def variable_args(option, opt_str, value, parser): """Parse options that have a variable number of arguments """ me = 'variable_args' assert value is None value = [] rargs = parser.rargs # Group all of the parser's options all_options = [] for option in parser.option_list: all_options = all_options + option._short_opts + option._long_opts while rargs: arg = rargs[0] # Stop if we hit an arg in the parser if arg in all_options: break else: value.append(arg) del rargs[0] print "%s: updating parser.values dest=%s with values %s" % \ (me, option.dest, value) setattr(parser.values, option.dest, value) # Setup the parser opt_parser = OptionParser(usage="%prog [options]", version="%prog 0.20", description="Move PHPbb threads/posts to a WordPress blog") opt_parser.add_option("-v", "--verbosity", help="Set the amount of output messages given", metavar="NUM", dest="verbosity", type="int") opt_parser.add_option("--verbose", help="Set verbosity to 5", dest="verbosity", action="store_const", const=5) opt_parser.add_option("-q", "--quiet", help="Set verbosity to 0 (only error messages)", dest="verbosity", action="store_const", const=0) opt_parser.add_option("-t", "--threads", help="Threads to translate (comma-separated list of IDs or URLs)", metavar="'THREAD, LIST[, ...]'", dest="threads", action="callback", callback=variable_args) opt_parser.add_option("-p", "--posts", help="Posts to translate (comma-separated list of IDs or URLs)", metavar="'POST, LIST[, ...]'", dest="posts", action="callback", callback=variable_args) opt_parser.add_option("-c", "--categories", help="Categories to add posts to (commma-separated list)", metavar="'CATEGORY, LIST[, ...]'", dest="categories", action="callback", callback=variable_args) opt_parser.add_option("-a", "--authors", help="Author mappings (comma-separated list)", metavar="BB_AUTH:WP_AUTH[, ...]", dest="authors", action="callback", callback=variable_args) opt_parser.set_defaults(verbosity=1) # Grab the command line options (opts, args) = opt_parser.parse_args() ######### ######### Console ######### $ ./phpbb2wp.py -c "Travel" "Teaching" -t 24 68 76 -a "BB Author 1: WP Author" "BB Author 2: WP Author" variable_args: updating parser.values dest=authors with values ['Travel', 'Teaching'] variable_args: updating parser.values dest=authors with values ['24', '68', '76'] variable_args: updating parser.values dest=authors with values ['BB Author 1: WP Author', 'BB Author 2: WP Author'] main: {'threads': None, 'verbosity': 1, 'posts': None, 'categories': None, 'authors': ['BB Author 1: WP Author', 'BB Author 2: WP Author']} |
From: Joe F. <pen...@gm...> - 2007-06-20 04:45:32
|
On 6/18/07, Joe Friedrichsen <pen...@gm...> wrote: > I've added all of the details below, both code and console output. The > print statements show that things aren't quite right. If anyone has > any insight about why I would get this behavior and how I can get it > working correctly, please tell me. Hi folks, I have an update -- I was able to solve my problem, but I've encountered some unexpected behavior. I fixed the option.dest = None problem by changing the way I set up the parser. Rather than using make_option and passing an option list to the constructor when I instantiated my parser (as seen here: http://www.python.org/doc/2.4.4/lib/optparse-populating-parser.html ), I instead created my parser object and then used its add_option method (common in most of the other examples). However, my arguments were going to the wrong option. The '-t' option should be adding 24, 68, and 76 to the 'threads' attribute, but the parser added them to the 'verbosity' attribute instead. This is unexpected since I didn't even use the -v option: $ ./phpbb2wp.py -c "Travel" -t 24 68 76 -a "BB Author 1: WP Author, BB Author 2: WP Author" variable_args: parser options = ['--version', '-h', '--help', '-t', '--threads', '-p', '--posts', '-c', '--categories', '-a', '--authors', '-v', '--verbosity', '--verbose', '-q', '--quiet'] variable_args: rargs = ['24', '68', '76', '-a', 'BB Author 1: WP Author, BB Author 2: WP Author'] variable_args: adding argument '24' variable_args: adding argument '68' variable_args: adding argument '76' variable_args: breaking... found '-a' variable_args: parser.values = {'threads': None, 'verbosity': 1, 'posts': None, 'categories': 'Travel', 'authors': None} variable_args: option.dest = verbosity variable_args: value = ['24', '68', '76'] variable_args: option.action = store_const main: {'threads': None, 'verbosity': ['24', '68', '76'], 'posts': None, 'categories': 'Travel', 'authors': 'BB Author 1: WP Author, BB Author 2: WP Author'} So, I tried changing the order in which I added options to the parser, and I finally got the behavior I wanted. I added the '-t' option last, and the parser is finally sending things to the right places. The correct code is: # Setup the parser opt_parser = OptionParser(usage="%prog [options]", version="%prog 0.20", description="Move PHPbb threads/posts to a WordPress blog") opt_parser.add_option("-p", "--posts", help="Posts to translate (comma-separated list of IDs or URLs)", metavar="'POST, LIST[, ...]'", dest="posts") opt_parser.add_option("-c", "--categories", help="Categories to add posts to (commma-separated list)", metavar="'CATEGORY, LIST[, ...]'", dest="categories") opt_parser.add_option("-a", "--authors", help="Author mappings (comma-separated list)", metavar="BB_AUTH:WP_AUTH[, ...]", dest="authors", ) opt_parser.add_option("-v", "--verbosity", help="Set the amount of output messages given", metavar="NUM", dest="verbosity", type="int") opt_parser.add_option("--verbose", help="Set verbosity to 5", dest="verbosity", action="store_const", const=5) opt_parser.add_option("-q", "--quiet", help="Set verbosity to 0 (only error messages)", dest="verbosity", action="store_const", const=0) opt_parser.add_option("-t", "--threads", help="Threads to translate (comma-separated list of IDs or URLs)", metavar="'THREAD, LIST[, ...]'", dest="threads", action="callback", callback=variable_args) opt_parser.set_defaults(verbosity=1) # Grab the command line options (opts, args) = opt_parser.parse_args() If anyone has any ideas about why this is happening, please tell me. Now that I have the behavior that I want, I'll be changing the -c, -p, and -a options to this same callback function, so I hope the parser can keep up :-) Thanks, Joe |
From: Joe F. <pen...@gm...> - 2007-06-18 06:06:28
|
Hi everyone, I'm trying to write a callback function for optparse and am having some trouble. I need a few options to accept a variable number of arguments, and so I based my variable_args callback function off of the example in the docs ( http://www.python.org/doc/2.4.4/lib/optparse-callback-example-6.html -- I'm using Debian Etch, so it's python 2.4.4 for me :-) I made the function a little more exact in knowing when to quit adding arguments to the current option, and that part part is working well so far. However, the function cannot update parser.values because option.dest is None. I'm confused because I've defined the dest for this option: dest="threads". What's even more strange is that option.action is 'help'. This makes me think that while the correct callback function was triggered for its corresponding option, the option object is either incorrect or not fully initialized. I've added all of the details below, both code and console output. The print statements show that things aren't quite right. If anyone has any insight about why I would get this behavior and how I can get it working correctly, please tell me. Thanks, Joe ####### ####### Code ####### def variable_args(option, opt_str, value, parser): """Parse options that have a variable number of arguments """ me = 'variable_args' assert value is None value = [] rargs = parser.rargs # Group all of the parser's options all_options = [] for option in parser.option_list: all_options = all_options + option._short_opts + option._long_opts print "%s: parser options = %s" % (me, all_options) print "%s: rargs = %s" % (me, rargs) while rargs: arg = rargs[0] # Stop if we hit an arg in the parser if arg in all_options: print "%s: breaking... found '%s'" % (me, arg) break else: print "%s: adding argument '%s'" % (me, arg) value.append(arg) del rargs[0] print "%s: parser.values = %s" % (me, parser.values) print "%s: option.dest = %s" % (me, option.dest) print "%s: value = %s" % (me, value) print "%s: option.action = %s" % (me, option.action) setattr(parser.values, option.dest, value) # Define the command line arguments from optparse import OptionParser, make_option option_list = [ make_option("-t", "--threads", help="Threads to translate (comma-separated list of IDs or URLs)", metavar="'THREAD, LIST[, ...]'", dest="threads", action="callback", callback=variable_args), make_option("-p", "--posts", help="Posts to translate (comma-separated list of IDs or URLs)", metavar="'POST, LIST[, ...]'", dest="posts"), make_option("-c", "--categories", help="Categories to add posts to (commma-separated list)", metavar="'CATEGORY, LIST[, ...]'", dest="categories"), make_option("-a", "--authors", help="Author mappings (comma-separated list)", metavar="BB_AUTH:WP_AUTH[, ...]", dest="authors", ), make_option("-v", "--verbosity", help="Set the amount of output messages given", metavar="NUM", dest="verbosity", type="int"), make_option("--verbose", help="Set verbosity to 5", dest="verbosity", action="store_const", const=5), make_option("-q", "--quiet", help="Set verbosity to 0 (only error messages)", dest="verbosity", action="store_const", const=0) ] # Setup the parser opt_parser = OptionParser(usage="%prog [options]", version="%prog 0.20", description="Move PHPbb threads/posts to a WordPress blog", option_list=option_list) opt_parser.set_defaults(verbosity=1) # Grab the command line options (opts, args) = opt_parser.parse_args() ####### ####### Console ####### $ ./phpbb2wp.py -c "Travel" -t 24 68 76 -a "BB Author 1: WP Author, BB Author 2: WP Author" variable_args: parser options = ['-t', '--threads', '-p', '--posts', '-c', '--categories', '-a', '--authors', '-v', '--verbosity', '--verbose', '-q', '--quiet', '--version', '-h', '--help'] variable_args: rargs = ['24', '68', '76', '-a', 'BB Author 1: WP Author, BB Author 2: WP Author'] variable_args: adding argument '24' variable_args: adding argument '68' variable_args: adding argument '76' variable_args: breaking... found '-a' variable_args: parser.values = {'threads': None, 'verbosity': 1, 'posts': None, 'categories': 'Travel', 'authors': None} variable_args: option.dest = None variable_args: value = ['24', '68', '76'] variable_args: option.action = help Traceback (most recent call last): File "./phpbb2wp.py", line 825, in ? main() File "./phpbb2wp.py", line 766, in main (opts, args) = opt_parser.parse_args() File "/usr/lib/python2.4/optparse.py", line 1280, in parse_args stop = self._process_args(largs, rargs, values) File "/usr/lib/python2.4/optparse.py", line 1324, in _process_args self._process_short_opts(rargs, values) File "/usr/lib/python2.4/optparse.py", line 1431, in _process_short_opts option.process(opt, value, values, self) File "/usr/lib/python2.4/optparse.py", line 712, in process return self.take_action( File "/usr/lib/python2.4/optparse.py", line 731, in take_action self.callback(self, opt, value, parser, *args, **kwargs) File "./phpbb2wp.py", line 730, in variable_args setattr(parser.values, option.dest, value) TypeError: attribute name must be string |
From: Erick T. <ida...@us...> - 2007-06-13 02:19:12
|
> svn co svn://starship.python.net/optik/trunk optik svn: Can't connect to host 'starship.python.net': Connection refused |
From: Diogo K. <di...@gm...> - 2007-04-01 18:46:08
|
> Okay, I've written a script which uses Optik/Optparse to display the > options (which works fine). The text for the help message is localised > (with german umlauts) and when I execute the script with the localised > environment variable set, I get this traceback[1]. The interesting > thing is that the localised optparse messages from displays fine - > it's only my localisation that errors. I'm not sure, but it seems from the post below that it's something that optparse is missing in print_help: http://mail.python.org/pipermail/python-dev/2006-May/065458.html |
From: Thorsten K. <tho...@th...> - 2007-03-31 21:49:55
|
Hi, this list has been fairly quiet for months so I hope someone's still reading this list... Okay, I've written a script which uses Optik/Optparse to display the options (which works fine). The text for the help message is localised (with german umlauts) and when I execute the script with the localised environment variable set, I get this traceback[1]. The interesting thing is that the localised optparse messages from displays fine - it's only my localisation that errors. What can I do to troubleshoot whether the culprit is my script, optik or gettext? Would it make sense to post the script and the mo or po files? Thorsten [1] Traceback (most recent call last): File "script.py", line 37, in <module> options, args = cmdlineparser.parse_args() File "/usr/lib/python2.5/optparse.py", line 1378, in parse_args stop = self._process_args(largs, rargs, values) File "/usr/lib/python2.5/optparse.py", line 1418, in _process_args self._process_long_opt(rargs, values) File "/usr/lib/python2.5/optparse.py", line 1493, in _process_long_opt option.process(opt, value, values, self) File "/usr/lib/python2.5/optparse.py", line 782, in process self.action, self.dest, opt, value, values, parser) File "/usr/lib/python2.5/optparse.py", line 804, in take_action parser.print_help() File "/usr/lib/python2.5/optparse.py", line 1648, in print_help file.write(self.format_help().encode(encoding, "replace")) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 264: ordinal not in range(128) |
From: David e F. <jd...@gm...> - 2007-03-03 21:23:37
|
Greetings! I have realized that using "from optparse import OptionParser" causes a lot of unncessary failed open() calls when running a python script. Do the following: $ strace -c python >>> from optparse import OptionParser Ctrl-d (Quit) You will notice "Calls: 502 Errors:409 Function:open" There are a lot of failed open()'s. OK, but the problem is when this is imported in a real py program file. What happens is that the current directory seems to be added to python's search path or something similar. So you get a bunch of failed open's on the current directory, which wouldn't happen if "optparse" wasn't imported. Here are the example calls: ### open("/home/def/Documents/hons/autoappl/hw3/prerelease/dis.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) open("/home/def/Documents/hons/autoappl/hw3/prerelease/dismodule.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) open("/home/def/Documents/hons/autoappl/hw3/prerelease/dis.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) open("/home/def/Documents/hons/autoappl/hw3/prerelease/dis.pyc", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) ### Neither of the filenames exist or should exist in the directory or the project. Hope this can be tracked down to some module that doesn't cleanup after playing with the PATH or something. Sincerely, David --------------------- http://www.defza.com |
From: Gregg L. <gr...@li...> - 2006-11-01 17:20:30
|
Martin Blais <blais <at> furius.ca> writes: > > By the way, for those using up to Python-2.4 (Optik 1.5a2), here is a > simple trick to implement the append_const action with a callback: > > def append_const_cb( const ): > "Create callback to implement an append_const action via a callback." > def cb( option, opt_str, value, parser ): > getattr(parser.values, option.dest).append(const) > return cb > > parser.add_option(..., > action='callback', callback=append_const_cb(YOUR_CONSTANT), > ...) > > parser.add_option(..., > action='callback', callback=append_const_cb(OTHER_CONSTANT), > ...) > > ------------------------------------------------------- > This SF.Net email is sponsored by xPML, a groundbreaking scripting language > that extends applications into web and mobile media. Attend the live webcast > and join the prime developer group breaking into this new coding territory! > http://sel.as-us.falkag.net/sel?cmd=lnk&kid0944&bid$1720&dat1642 > One small addition: we need to set the destination variable to an empty list when we first encounter it. def append_const_cb( const ): """Create callback to implement an append_const action via a callback. Needed in python 2.4, since append_const first appears in python2.5 from: http://comments.gmane.org/gmane.comp.python.optik.user/261 """ def cb( option, opt_str, value, parser ): if not getattr(parser.values, option.dest): setattr(parser.values, option.dest, list()) getattr(parser.values, option.dest).append(const) return cb |