Access to raw command line?

Michael Hoffman cam.ac.uk at mh391.invalid
Thu Apr 26 07:36:48 EDT 2007


Pieter Edelman wrote:
> Hi,
> 
> I'm currently writing a command-line program in Python, which takes
> commands in the form of:
> ./myprog.py [OPTIONS] ARGS
> So pretty standard stuff. In my case, ARGS is a list of image files.
> 
> One of the possible options is to specify a file holding information
> about the photos. You'd specify it with (in this particular case) the -
> t switch, and you can specify multiple files by repeating this switch:
> ./myprog.py -t info1.gpx -t info2.gpx -t info3.gpx *jpg
> 
> Now, one of the users has quite a lot of info files, and asked me if
> it's possible to use a wildcard in specifying these, so he would just
> have to do:
> ./myprog.py -t *.gpx *.jpg
> 
> This seems like a sensible option at first sight, but it's difficult
> to implement because the wildcard is expanded by the shell, so
> sys.argv gets a list containing "-t", all .gpx files and all .jpg
> files. With this list, there's no way to tell which files belong to
> the "-t" switch and which are arguments (other than using the
> extension).
> 
> One possible way to work around this is to get the raw command line
> and do the shell expansions ourselves from within Python. Ignoring the
> question of whether it is worth the trouble, does anybody know if it
> is possible to obtain the raw (unexpanded) command line?
> Alternatively,  does anybody have suggestion of how to do this in a
> clean way?

One option would be to accept a directory argument to -t and to 
recursively inlcude all the gpx files in that directory.

Another option would be to use some sort of optional separator, like

./myprog.py -t *.gpx -j *.jpg

where everything between -t and -j would be considered a -t option. I 
think this breaks the usual UNIX options paradigm though. Of course UNIX 
itself does that--dd is an example of a program that doesn't follow it.

Another option would be to accept a list of gpx files from a file:

find . -name '*.gpx' > gpxlist.txt
./myprog.py --gpx-file=gpxlist.txt *.jpg

Or to accept more than one file per argument:

./myprog.py -t "$(echo *.gpx)" *.jpg

Personally I would prefer the file list approach. If you start expanding 
wildcards yourself, then if someone stupidly wants to use a wildcard 
character, they'll have to triple-escape things, and it'll just be messy.
-- 
Michael Hoffman



More information about the Python-list mailing list