2011-12-12 19 views
13

Esto es probablemente algo realmente básico, pero no puedo encontrar una buena solución para ello. Tengo que escribir un script en Python que puede aceptar la entrada de una tubería de la siguiente manera:¿Cómo se redirige una salida de comando de shell a una entrada de script de Python?

$ some-linux-command | my_script.py 

algo como esto:

cat email.txt | script.py 

O simplemente se canaliza por mi archivo .forward directamente de sendmail . Esto significa que el archivo de entrada podría ser algo relativamente grande si tiene un archivo adjunto, y probablemente será un correo electrónico, más adelante tendré que poner en una base de datos el remitente, el tema y demás, pero he escrito guiones de base de datos en python, entonces esa parte estará bien. El problema principal es cómo capturar los datos que fluyen desde la tubería.

+0

¿Por qué estás obsesionado con la tubería? ¿No puedes escribir ese resultado en un archivo y realizar operaciones en él más tarde? –

+5

@SrinivasReddyThatiparthy: pipe es la esencia de Unix, tu comentario no es válido. – Stan

Respuesta

3

lectura de sys.stdin, que es un archivo como objeto

21

Uso sys.stdin para leer la entrada. Ejemplo:

contenido Ejemplo de s.py:

import sys 
data = sys.stdin.readlines() 
print data 

- reproducción:

[email protected]:~$ cat t.txt 
    alpha 
    beta 
    gamma 

    [email protected]:~$ cat t.txt | python ./s.py 
    ['alpha\n', 'beta\n', 'gamma\n'] 

Usted también puede hacer que el script Python como script de shell que utiliza este Shebang:

#!/usr/bin/env python 

y cambio de permiso a 'a + x'

[email protected]:~$ cat t.txt | ./s.py 
['alpha\n', 'beta\n', 'gamma\n'] 
+0

Gracias, funciona, y afortunadamente puedo importar sys en esa caja, (es Solaris 10, tiene problemas para importar otros módulos, para algunos módulos arroja un "ImportError: ld.so.1:/usr/local/bin"/python: fatal: error de reubicación: archivo /usr/local/lib/python2.6/lib-dynload/_socket.so: símbolo inet_aton: símbolo de referencia no encontrado "porque es inet_pton en solaris.) – delta

+8

puede aceptarlo como respuesta correcta si funciona – DhruvPathak

Cuestiones relacionadas