2016-12-13 2 views
0

Ich versuche, das Befehlszeilenargument mit Leerraum in ihm zu passieren, aber sys.argv[1].strip() gibt mir nur die erste Wort des ArgumentsPassing Befehlszeilenargument mit Leerzeichen in Python

import sys, os 
docname = sys.argv[1].strip() 

e.g. $ python myscript.py argument with whitespace 

Wenn ich zu debuggen versuchen - docname gibt mir Ausgabe als argument statt argument with whitespace

ich habe versucht, den weißen Raum mit .replace(" ","%20") Methode zu ersetzen, aber das half verwendennicht

Antwort

8

Das hat nichts mit Python und alles zu tun, mit dem Shell zu tun. Die Shell hat eine Funktion namens wordsplitting, die jedes Wort in Ihrem Befehl Aufruf ein separates Wort oder Arg macht. Um das Ergebnis als einzelnes Wort mit Leerzeichen an Python zu übergeben, müssen Sie entweder die Leerzeichen ausschließen oder Anführungszeichen verwenden.

./myscript.py 'argument with whitespace' 
./myscript.py argument\ with\ whitespace 

Mit anderen Worten, durch die Zeit zu Python Ihre Argumente bekommen hat wordsplitting bereits geschehen ist, hat die unescaped Leerzeichen eliminiert und sys.argv ist (grundsätzlich) eine Liste von Wörtern.

+0

Escaping wäre: './myscript.py Argument \ mit \ Leerzeichen " – Xevaquor

0

Sie benötigenstatt argv[1]:

docname = sys.argv[1:] 

Um es als String zu drucken:

' '.join(sys.argv[1:]) # Output: argument with whitespace 

sys.argv[0] ist der Name des Skripts selbst und sys.argv[1:] ist eine Liste aller Argumente an das Skript übergeben.

Ausgang:

>>> python myscript.py argument with whitespace 
['argument', 'with', 'whitespace'] 
+0

Sind Sie sicher, dass strip() auf einer Liste funktioniert? – Organis

+0

Ich weiß, dass 'strip()' eine 'str' Methode ist, deshalb verwende ich' sys.argv [1:] ' – ettanany

+0

sys.argv ist eine Liste also sys.argv [1:] ist ein Stück davon Liste. – Organis