using python on the command line with 'here-documents' and pipes
roy at panix.com
Sun Nov 14 19:08:23 CET 2004
calmar <calmar at calmar.ws> wrote:
> I would like to be able to pipe things into python.
Python is perfectly happy reading stdin and writing to stdout, so it's
also perfectly happy acting as a component in a pipe.
> Actually I would not like
> writing a 'script' to handle the input, but write the python commands
> right onto the command line.
You can do this with the -c command line option:
$ python -c 'print "hello world"'
> It would be possible to use here-documents (for having the correct
> identation during e.g while loops) for writing python code on
> the fly, but then how and where to get the pipe output:
I think you're confusing two different things: where python gets the
code it's going to execute, and where it gets the input it's going to
feed to that executing code. You can use here-is documents for the
input, and -c for the code, and end up with something like this:
$ python -c 'import sys
> for line in sys.stdin:
> print line[:10]
> ' << EOF
> line one of many
> line two of many
> line three of many
line one o
line two o
Whether or not the single-quote mechanism reads past newlines and
properly preserves indentation is more a function of what shell you're
using than the python interpreter itself (the above was done with bash).
> Would anybody have an idea how to use python like e.g. awk etc. As a
> tool within, where I can handle the stdin data, and write the code right
> there (e.g. with here documents)?
Well, the above will work, but I don't think it's a particularly good
idea. I think you would do better putting the text of your python
script in a .py file, make the first line #!/usr/bin/python, and make it
executable. Then you've got a stand-alone program that you can edit and
maintain apart from the shell script that surrounds it. In the long
run, this is likely to be simpler to test and to maintain.
Of course, if you want to be a bit perverse, you can always do:
$ python /dev/stdin << EOF
> print "hello, bizarre world"
hello, bizarre world
but I think that's more of a curiosity than a useful tool. Along the
same lines, I once knew somebody who linked /dev/tty.c to /dev/tty. He
could then do "cc /dev/tty.c" and type in c code directly to the
compiler". He was a sick puppy.
More information about the Python-list