Re: argparse - specify order of argument parsing?
Eduardo Alvarez wrote: When using argparse, is there a way to specify in what order arguments get parsed? I am writing a script whose parameters can be modified in the following order: Defaults - config file - command-line switches. However, I want to give the option of specifying a config file using a command line switch as well, so logically, that file should be parsed before any other arguments are applied. However, it seems that parse_args() parses arguments in the order they're given, so if the config file switch is not given first, the config file will overwrite whatever was in the command-line switches, which should have higher priority. Thank you in advance, If you use http://docs.python.org/dev/library/argparse.html#fromfile-prefix-chars to read the configuration file it should be obvious to the user that the order is significant. You can even construct multiple config files with partially overlapping options: $ cat load_options.py import argparse parser = argparse.ArgumentParser(fromfile_prefix_chars=@) parser.add_argument(--infile) parser.add_argument(--outfile) parser.add_argument(--logfile) print(parser.parse_args()) $ cat option1.txt --infile=alpha.txt --outfile=beta.txt $ cat option2.txt --outfile=GAMMA.txt --logfile=DELTA.txt $ python load_options.py @option1.txt @option2.txt Namespace(infile='alpha.txt', logfile='DELTA.txt', outfile='GAMMA.txt') $ python load_options.py @option2.txt @option1.txt Namespace(infile='alpha.txt', logfile='DELTA.txt', outfile='beta.txt') If you insist you could modify the argument list with the following hack: sys.argv[1:] = sorted(sys.argv[1:], key=lambda arg: arg.startswith(@), reverse=True) There might also be a way to utilize parse_known_args(). -- http://mail.python.org/mailman/listinfo/python-list
argparse - specify order of argument parsing?
When using argparse, is there a way to specify in what order arguments get parsed? I am writing a script whose parameters can be modified in the following order: Defaults - config file - command-line switches. However, I want to give the option of specifying a config file using a command line switch as well, so logically, that file should be parsed before any other arguments are applied. However, it seems that parse_args() parses arguments in the order they're given, so if the config file switch is not given first, the config file will overwrite whatever was in the command-line switches, which should have higher priority. Thank you in advance, -- Eduardo Alvarez -- http://mail.python.org/mailman/listinfo/python-list
Re: argparse - specify order of argument parsing?
On 2013-08-31 13:11, Eduardo Alvarez wrote: When using argparse, is there a way to specify in what order arguments get parsed? I am writing a script whose parameters can be modified in the following order: Defaults - config file - command-line switches. However, I want to give the option of specifying a config file using a command line switch as well, so logically, that file should be parsed before any other arguments are applied. However, it seems that parse_args() parses arguments in the order they're given, so if the config file switch is not given first, the config file will overwrite whatever was in the command-line switches, which should have higher priority. While I haven't come up with a good solution using argparse/optparse alone, I've found that it's easier (for processing) to specify the config file as an environment variable. So rather than doing my_prog.py -c /path/to/config.ini arg1 arg2 ... I just do MY_PROG_CONF=/path/to/config.ini my_prog.py arg1 arg2 ... ...at least on *nix systems; on Win32, it's c:\temp set MY_PROG_CONF=c:\path\to\config.ini c:\temp python my_prog.py arg1 arg2 ... Then you just intercept the config-file name from os.environ: config_file = os.environ.get( MY_PROG_CONF, default_ini_location) -tkc -- http://mail.python.org/mailman/listinfo/python-list
Re: argparse - specify order of argument parsing?
On 8/31/2013 1:11 PM, Eduardo Alvarez wrote: When using argparse, is there a way to specify in what order arguments get parsed? I expect argparse to forward iterate the sequence of arguments that it receives. I am writing a script whose parameters can be modified in the following order: Defaults - config file - command-line switches. However, I want to give the option of specifying a config file using a command line switch as well, so logically, that file should be parsed before any other arguments are applied. However, it seems that parse_args() parses arguments in the order they're given, Right. so if the config file switch is not given first, the config file will overwrite whatever was in the command-line switches, which should have higher priority. So just document that a config file has to be given first to work as expected. Order dependence among arguments is common. -- Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list
Re: argparse - specify order of argument parsing?
On 8/31/2013 2:13 PM, Terry Reedy wrote: On 8/31/2013 1:11 PM, Eduardo Alvarez wrote: When using argparse, is there a way to specify in what order arguments get parsed? I expect argparse to forward iterate the sequence of arguments that it receives. Aside from the environment variable solution, you could search sys.argv for 'config=filename' and remove it and process it *before* you invoke argparse. -- Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list
Re: argparse - specify order of argument parsing?
On 31Aug2013 14:17, Terry Reedy tjre...@udel.edu wrote: | On 8/31/2013 2:13 PM, Terry Reedy wrote: | On 8/31/2013 1:11 PM, Eduardo Alvarez wrote: | When using argparse, is there a way to specify in what order arguments | get parsed? | | I expect argparse to forward iterate the sequence of arguments that it | receives. | | Aside from the environment variable solution, you could search | sys.argv for 'config=filename' and remove it and process it *before* | you invoke argparse. Although, speaking for myself, I like options to have effect as encountered: some-cmd -a --no-foo Would turn on all options then turn off foo. Hard to do if you look for more important options and then less important options. I'm personally against out-of-order option handling; it confuses things for the user. If you (as the user) need the config file to be known first, put it first. Cheers, -- Cameron Simpson c...@zip.com.au You wouldn't... ...but you KNOW you could. - Original V65 Commercial -- http://mail.python.org/mailman/listinfo/python-list