sys module - argv, but no argc ??

François Pinard pinard at iro.umontreal.ca
Mon Aug 5 08:38:08 EDT 2002


[Greg Ewing]

> I remember the time I wrote a Python program which essentially did

>    import sys, os
>    for f in sys.argv:
>      os.unlink(f)

> and was amused to find that, the first time it was run, it worked
> perfectly and then deleted itself. :-)

Amusing, and instructive! :-)

I had to sit and think about many ways and avenues before choosing a style
for how to handle arguments in a Python program.  I settled for this idiom:

---------------------------------------------------------------------->
...
import sys
...

def main(*arguments):
    ...

if __name__ == '__main__'
    main(*sys.argv[1:])
----------------------------------------------------------------------<

(the last line was "apply(main, tuple(sys.argv[1:]))" in older times).

One advantage is that `main' does not see the program name as an argument
by default, while the program name can be explicitly accessed through
"sys.argv[0]" for the unusual cases it is really needed.

Another benefit is that the module may be imported interactively, and
interactively called with "main('ARG1', 'ARG2', 'ARG3' ...)"  in a way
which is rather natural.

A final virtue is that the module may be imported from another one, and
its main method called like interactively above, effectively turning one
stand-alone program into an importable function within another, and so,
by not using `os.system' or `os.popen', avoiding spurious Python reloads.
There are other ways to this virtue, of course, but the above choosen
idiom makes it more consistent, especially as we are systematic about it.

-- 
François Pinard   http://www.iro.umontreal.ca/~pinard




More information about the Python-list mailing list