Determine actually given command line arguments

Henry Leyh henry.leyh at ipp.mpg.de
Thu May 16 01:43:42 EDT 2013


On 15.05.2013 17:29, Roy Smith wrote:
> In article <kn00fb$8kc$1 at gwdu112.gwdg.de>,
> Henry Leyh  <henry.leyh at ipp.mpg.de> wrote:
>> On 15.05.2013 14:24, Roy Smith wrote:
>>> In article <kmva9j$1hbk$1 at gwdu112.gwdg.de>,
>>>    Henry Leyh <henry.leyh at ipp.mpg.de> wrote:
>>>
>>>> Is there a simple way to determine which
>>>> command line arguments were actually given on the commandline, i.e. does
>>>> argparse.ArgumentParser() know which of its namespace members were
>>>> actually hit during parse_args().
>>>
>>> I think what you're looking for is sys.argv:
>>>
>>> $ cat argv.py
>>> import sys
>>> print sys.argv
>>>
>>> $ python argv.py foo bar
>>> ['argv.py', 'foo', 'bar']
>>
>> Thanks, but as I wrote in my first posting I am aware of sys.argv and
>> was hoping to _avoid_ using it because I'd then have to kind of
>> re-implement a lot of the stuff already there in argparse, e.g. parsing
>> sys.argv for short/long options, flag/parameter options etc.
>
> Sorry, I missed that.
>
> I'm not clear on exactly what you're trying to do.  You say:
>
>> Now I would also like the program to be able to _write_ a
>> configparser config file that contains only the parameters actually
>> given on the commandline.
>
> I'm guessing what you're trying to do is parse the command line first,
> then anything that was set there can get overridden by a value in the
> config file?  That seems backwards.  Usually, the order is:
>
> 1) built-in default
> 2) config file (possibly a system config file, then a per-user one)
> 3) environment variable
> 4) command-line argument
>
> It sounds like you're doing it in the reverse order -- allowing the
> config file to override the command line.

No.  The program reads a general config file in $HOME, something like 
~/.programrc; then parses the command like for '-c FILE' and, if FILE is 
present reads it; then parses the command line remains for more 
arguments which overwrite everything previously set.  (For the record, 
this split parsing is done with two argparse parsers.  The first parses 
for '-c FILE' with parse_known_args().  If there is a FILE, its contents 
is used as defaults for a second parser (using set_options()) which then 
parses the remains that were returned by the first parser's 
parse_known_args().)

But now I would also like to be able to _write_ such a config file FILE 
that can be read in a later run.  And FILE should contain only those 
arguments that were given on the command line.

Say, I tell argparse to look for arguments -s|--sopt STRING, -i|--iopt 
INT, -b|--bopt [BOOL], -C CONFFILE.  Then 'prog -s bla -i 42 -C cfile' 
should produce a confparser compatible cfile which contains

   [my_options]
   sopt = blah
   iopt = 42

and not 'bopt = False' (if False was the program's default for bopt).

Regards,
Henry




More information about the Python-list mailing list