[Tutor] Unix philosophy

Guillermo Fernandez Castellanos guillermo.fernandez at epfl.ch
Tue Nov 18 06:23:49 EST 2003


Thanks for the answers.
I'm reading the digest version of the mailing list, that's why I grouped 
the answers.

> There are probably other ways to do this using exec or
> something, but I'd probably make all of the programs
> as libraries and make one short script connecting them
> all together. You know how do do that, don't you?

Actually it was my philosophy until now. I am developing a utility and I'm separating it into libraries (one to parse text, another to join files, another to make database queries) but I always try to also allow the libraries to be used as single programs (with the if __name__=='__main__':). But I though it would be neat to do it the 'pipeline' way :-) It would allow the user to reproduce my program using a single command line and that way 'personalize' the execution (if he don't need a library for example).

> I use the fileinput module to do this:
>    http://www.python.org/doc/current/lib/module-fileinput.html
> works great for all kinds of files, multiple files, stdin, etc.
Indeed it seems to answer what I was looking for :-)

> Basically, what you have to do is read input from stdin and write
> output to stdout.  That makes it possible to use it as a filter in a
> pipeline like
>   grep something < file | python myprog.py | lp
> or whatever.  The "|" signs here connect the first program's stdout to
> the second program's stdin.

> This is a bit unfriendly so its common to write programs that
> take a command line argument which switches filter behavious
> on or off. There is no fixed convention for how this is done.

That means that if I wanted to do it in a more general way that with fileinput module I should use the sys.stdin/out functions?
Are you thinking to something like this:
# Simple cat UNIX command
import sys
if len(sys.argv)==1:
    for files in sys.argv[1:]:



More information about the Tutor mailing list