2012-08-07 6 views
5

Was wäre der Prozess, mit dem meine Python-Skripts mit 'xargs' funktionieren? Zum Beispiel möchte ich der folgende Befehl durch jede Zeile der Textdatei arbeiten, und führen Sie einen beliebigen Befehl:Erstellen von Python-Skripten mit XARGs

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

möchte im Wesentlichen jede Zeile an das hardware.py Skript übergeben werden.

+2

Was Sie dort zeigen, ist * Standardeingabe *, aber was Sie * fragen * ist 'xargs'. Sie sind nicht dasselbe. Was wolltest du? – kojiro

+0

Gibt es einen besonderen Grund, warum Sie nicht einfach die Textdatei in Python einlesen können? – ciferkey

+0

Die Pipe verbindet nur den 'cat'' stdout' mit hardware.py 'stdin'. In hardware.py sollten Sie also nur die Daten aus dem 'stdin' lesen (z. B. data = raw_input()). –

Antwort

6

Um Ihre Befehle mit xargs arbeiten zu lassen, brauchen Sie sie nur, um Argumente zu akzeptieren. Argumente in Python sind in der sys.argv Liste. Auf diese Weise können Sie somthing wie ausführen:

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

, die

gleichwertig sein könnte
./myscript.py ./foo.txt ./biz/foobar.txt ./baz/yougettheidea.txt 

Um Ihre Befehle arbeiten mit der Standardeingabe zu machen, können Sie auch das sys Modul verwenden können, diesmal mit sys.stdin, die Sie als Datei behandeln können. Dies ist mehr wie das von Ihnen angegebene Beispiel:

./myscript.py < somefile.txt 
1

Sie verwechseln zwei Probleme.

Zunächst kann Ihre Anwendung Eingaben von stdin erhalten. Dies hat nichts mit xargs zu tun. In Ihrem Beispiel alle hardware.py tun muss, ist sys.stdin als Eingabedatei lesen, zB:

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

Wenn Sie hardware.py Ausgabe zu erzeugen, dass andere Programme auf der ganzen Linie verwenden, schreiben Sie einfach an sys.stdout

Zweitens kann Ihre Anwendung Eingaben von Argumenten erhalten. Hier würden Sie xargs verwenden. Beispiel:

xargs ./hardware.py < servers.txt # wie cat servers.txt | xargs ./hardware.py

Dies würde jedes "Wort" von servers.txt (nicht jede Zeile) als Argument an hardware.py übergeben (möglicherweise mehrere Argumente gleichzeitig). Dies wäre das gleiche wie das Ausführen hardware.py word1 word2 word3 word4 ...

Python speichert Befehlszeilenargumente im Array sys.arvg. sys.argv[0] wird der Befehlsname und sys.argv[1:] werden alle Befehlszeilenargumente sein. In der Regel ist es jedoch besser, Ihre Befehlszeile mit argparse zu verarbeiten.

0

Es ist nicht ganz klar, was Sie tun möchten.Wenn ./hardware.py -m eine Zeile von der Standardeingabe liest, können Sie GNU Parallel verwenden, um diese Zeilen zu verteilen:

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

Wenn ./hardware.py -m einen einzelnen Server als Argument können Sie tun:

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

Sie können GNU installieren Parallel einfach durch:

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

beobachten Sie die Intro-Videos für GNU Parallel mehr zu erfahren: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1