2012-03-28 7 views
2

Angenommen, ich möchte die Ausgabe von rsgen.py als references Argument meiner simulate.py Skript verwendet werden. Wie kann ich es tun?Python argparse & Unix Rohrleitungen zu Argumenten

In simulate.py

parser.add_argument("references", metavar="RS", type=int, nargs="+", help="Reference string to use") 

versuchte ich

# ./simulate.py references < rs.txt 
usage: simulate.py [-h] [--numFrames F] [--numPages P] RS [RS ...] 
simulate.py: error: argument RS: invalid int value: 'references' 

# ./simulate.py < rs.txt 
usage: simulate.py [-h] [--numFrames F] [--numPages P] RS [RS ...] 
simulate.py: error: too few arguments 

Ich glaube, meine Leitungs Syntax falsch ist, wie kann ich es beheben?

Idealy, möchte ich direkt die Ausgabe des Befehls rsgen.py in das references Argument von simulate.py

Antwort

3

Wenn Sie meinen, Sie die Ausgabe von rsgen.py als Befehlszeilenparameter verwenden möchten, einfachen Anführungszeichen Gebrauch simulate.py die die enthaltenen Befehl ausführen und die Ausgabe in der Befehlszeile setzen

./simulate.py `./rsgen.py` 
+0

eine andere Syntax $ ./simulate.py $ (rsgen.py) von imho ./rsgen.py $ | ./simulate.py ist besser. –

+1

Dies ist die einfachste und am weitesten verbreitete Shell-Syntax zum Umwandeln der Programmausgabe in ein Befehlszeilenargument. Sie müssen sich in Ihrem Anwendungsfall keine Gedanken über Verschachtelung oder irgendetwas anderes machen. Aber benutze das nicht, wenn die Ausgabe von rsgen wirklich enorm ist: Benutze in diesem Fall eine Pipe und lies simulate.py von stdin. – alexis

3

Wenn Sie die Ausgabe von rsgen.py als Argument, die beste Lösung zu geben brauchen, ist command substitution zu verwenden. Die Syntax variiert je nach der Shell Sie verwenden, aber das Folgende auf den meisten modernen Schalen arbeiten:

./simulate.py references $(./rsgen.py) 

Exkurs, Brian Swift Antwort verwendet Backticks für Kommandosubstitution. Die Syntax ist auch für die meisten Shells gültig, hat aber den Nachteil, dass sie nicht wirklich gut verschachtelt werden kann.

Auf der anderen Seite, wenn Sie die Ausgabe eines Skripts in ein anderes Rohr möchten, sollten Sie von sys.stdin

Beispiel lesen:

a.py

print "hello world" 

b.py

import sys 

for i in sys.stdin: 
    print "b", i 

Ergebnis:

$ ./a.py | ./b.py 
b hello world