2012-08-07 9 views
5

¿Cuál sería el proceso para que mis scripts de Python funcionen bien con 'xargs'? Por ejemplo, me gustaría que el siguiente comando para trabajar a través de cada línea del archivo de texto, y ejecutar un comando arbitrario:Hacer que los scripts de Python funcionen con xargs

cat servers.txt | ./hardware.py -m 

Esencialmente le gustaría cada línea que se pasa a la secuencia de comandos hardware.py.

+2

Lo que muestra allí es * entrada estándar *, pero lo que * pregunta * es 'xargs'. No són la misma cosa. ¿Qué quieres? – kojiro

+0

¿Hay alguna razón en particular por la que no puedas leer en el archivo de texto en Python? – ciferkey

+0

El tubo simplemente conecta 'cat'' stdout' al hardware.py 'stdin'. Por lo tanto, en hardware.py, solo debe leer los datos del 'stdin' (por ejemplo, data = raw_input()). –

Respuesta

6

Para hacer que sus comandos funcionen con xargs, simplemente necesita que acepten argumentos. Los argumentos en Python están en la lista sys.argv. De esta manera se puede ejecutar algo como:

find . -type f -name '*.txt' -print0 | xargs -0 ./myscript.py 

que podría ser equivalente a

./myscript.py ./foo.txt ./biz/foobar.txt ./baz/yougettheidea.txt 

Para hacer sus comandos funcionan con la entrada estándar, también puede utilizar el módulo sys, esta vez con sys.stdin, que puedes tratar como un archivo. Es más parecido al ejemplo que dio:

./myscript.py < somefile.txt 
1

Está confundiendo dos problemas.

Primero, su aplicación puede recibir información de stdin. Esto no tiene nada que ver con xargs. En su ejemplo, todos hardware.py tiene que hacer es leer sys.stdin que el de entrada, por ejemplo:

if __name__=='__main__': 
    for line in sys.stdin: 
     do_something(line) 

Si desea hardware.py producir una salida que otros programas en la línea pueden utilizar, acaba de escribir para sys.stdout

En segundo lugar, su aplicación puede recibir información de los argumentos. Aquí es donde usaría xargs. Por ejemplo:

xargs ./hardware.py < servers.txt # igual que cat servers.txt | xargs ./hardware.py

Esto pasaría cada "palabra" de servers.txt (no cada línea) como un argumento para hardware.py (posiblemente múltiples argumentos a la vez). Esto sería lo mismo que ejecutar hardware.py word1 word2 word3 word4 ...

Python almacena argumentos de línea de comandos en la matriz sys.arvg. sys.argv[0] será el nombre del comando y sys.argv[1:] serán todos los argumentos de la línea de comandos. Sin embargo, generalmente es mejor que proceses tu línea de comando usando argparse.

0

No está del todo claro qué es lo que quiere hacer.Si ./hardware.py -m lee una línea desde la entrada estándar, se puede utilizar en paralelo GNU para distribuir esas líneas:

cat servers.txt | parallel --pipe -N1 ./hardware.py -m 

Si ./hardware.py -m toma un único servidor como argumento que puede hacer:

cat servers.txt | parallel ./hardware.py -m 

Se puede instalar en paralelo GNU simplemente por:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

Mira los vídeos de introducción de GNU paralelo para aprender más: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Cuestiones relacionadas