2009-04-14 2 views
5

ich ein einfaches Python-Skript haben etwa so:Vorbei an einer mehrzeiligen Zeichenfolge als Argument an ein Skript in Windows

import sys 

lines = sys.argv[1] 

for line in lines.splitlines(): 
    print line 

will ich es von der Kommandozeile aufrufen (oder eine .bat-Datei), aber Das erste Argument kann (und wird wahrscheinlich) eine Zeichenfolge mit mehreren Zeilen sein. Wie macht man das?

Natürlich funktioniert dies:

import sys 

lines = """This is a string 
It has multiple lines 
there are three total""" 

for line in lines.splitlines(): 
    print line 

Aber ich muss in der Lage sein, ein Argument Zeile-für-Zeile zu verarbeiten.

EDIT: Dies ist wahrscheinlich eher ein Windows-Befehlszeilenproblem als ein Python-Problem.

EDIT 2: Danke für all die guten Vorschläge. Es sieht nicht so aus als wäre es möglich. Ich kann keine andere Shell verwenden, weil ich tatsächlich versuche, das Skript von einem anderen Programm aufzurufen, das anscheinend die Windows-Befehlszeile hinter den Kulissen verwendet.

+0

Ich verstehe nicht - hat was Sie jetzt nicht arbeiten? –

+0

Sie sollten durch "\ n" teilen und entfernen Sie das "\ r" vorher für bessere Plattformkompatibilität. Gibt 'bash' in seinen Argumenten Carraige zurück? (Nicht sicher). –

+0

Sie sollten das String-Modul überhaupt nicht verwenden. Diese Zeile sollte "line = multiline.splitlines()" lesen –

Antwort

2

umschließen Sie einfach das Argument in Anführungszeichen:

$ python args.py "This is a string 
> It has multiple lines 
> there are three total" 
This is a string 
It has multiple lines 
there are three total 
+0

Kann dies über die Windows-Befehlszeile erfolgen? –

+0

Anscheinend nicht .. – skrebbel

0

Nicht sicher über die Windows-Befehlszeile, aber würde die folgende Arbeit?

> python myscript.py "This is a string\nIt has multiple lines\there are three total" 

..oder ..

> python myscript.py "This is a string\ 
It has [...]\ 
there are [...]" 

Wenn nicht, würde ich Cygwin und mit einem gesunden Shell vorschlagen Installation!

+0

Weder. Zunächst verwendet cmd nicht \ als Escape-Zeichen, sondern verwendet ^. Zweitens würde^n nur ein Literal n ergeben, da^nur benutzt werden kann, um Sonderzeichen zu umgehen, aber es hat keine Möglichkeiten, Sonderzeichen wie \ n, \ usw. zu erzeugen. – Joey

1

könnte folgende Arbeiten:

C:\> python something.py "This is a string^ 
More? 
More? It has multiple lines^ 
More? 
More? There are three total" 
+0

Damit kann ich meine Zeichenfolge effektiv überspannen mehrere Zeilen, aber endet immer noch ohne die "newline" Zeichen in der Zeichenfolge. –

+1

Die leeren Zeilen sind in diesem Fall wichtig. Zumindest funktionierte es für Echo, mehrere Zeilen auszugeben, aber ich konnte es im Moment nicht testen. Wenn alles andere fehlschlägt, verwenden Sie die von anderen vorgeschlagene Pipeline-Lösung. Es ist kein Problem, mehrere Zeilen durch stdin zu übergeben. – Joey

0

Haben Sie Sie mehrzeiligen Text als Variable versucht Einstellung und geben dann die Erweiterung der, dass in Ihrem Skript. Zum Beispiel:

set Text="This is a string 
It has multiple lines 
there are three total" 
python args.py %Text% 

Alternativ kann statt ein Argument des Lesens können Sie von Standard lesen

import sys 

for line in iter(sys.stdin.readline, ''): 
    print line 

Unter Linux würden Sie Rohr die mehrzeiligen Text an die Standardeingabe von args.py..

$ < Befehl-das-produziert-Text > | Python args.py

+0

Scheint überhaupt nicht zu funktionieren. Nicht direkt von der Windows-Befehlszeile und nicht von einer Batch-Datei. – skrebbel

1

Das ist das einzige, was für mich gearbeitet:

C:\> python a.py This" "is" "a" "string^ 
More? 
More? It" "has" "multiple" "lines^ 
More? 
More? There" "are" "three" "total 

Für mich Johannes' solution ruft den Python-Interpreter am Ende der ersten Zeile, also habe ich nicht die Chance, einen Pass zu spielen zusätzliche Zeilen.

Aber Sie sagten, dass Sie das Python-Skript von einem anderen Prozess aufrufen, nicht von der Befehlszeile. Warum benutzt du dann nicht dbr' solution? Dieser arbeitete für mich als Ruby-Skript:

puts `python a.py "This is a string\nIt has multiple lines\nThere are three total"` 

Und in welcher Sprache werden Sie das Programm zu schreiben, die den Python-Skript ruft?Das Problem, das Sie haben, ist mit Argumente vorbei, nicht mit dem Windows-Shell, nicht mit Python ...

Schließlich, wie mattkemp sagte, empfehle ich Sie auch die Standardeingabe verwenden, um Ihr mehrzeiligen Argument zu lesen, zu vermeiden Befehlszeilen-Magie.

2

Ich weiß, dass dieser Thread ziemlich alt ist, aber ich stieß darauf, während ich versuchte, ein ähnliches Problem zu lösen, und andere könnten auch, also lassen Sie mich Ihnen zeigen, wie ich es gelöst habe.

Dies zumindest unter Windows XP arbeitet Pro, mit Zacks Code in einer
Datei mit dem Namen "C: \ Scratch \ test.py":

C:\Scratch>test.py "This is a string"^ 
More? 
More? "It has multiple lines"^ 
More? 
More? "There are three total" 
This is a string 
It has multiple lines 
There are three total 

C:\Scratch> 

Dies ist ein wenig besser lesbar als Romulo Lösung oben .