Kann nicht argparse, um zitierte Zeichenfolge mit Bindestrichen darin zu lesen?

Gibt es einen Weg, um argparse etwas zwischen zwei Zitaten als ein einziges Argument zu erkennen? Es scheint, die Bindestriche zu sehen und davon auszugehen, dass es der Beginn einer neuen Option ist

Ich habe so was:

mainparser = argparse.ArgumentParser() subparsers = mainparser.add_subparsers(dest='subcommand') parser = subparsers.add_parser('queue') parser.add_argument('-env', '--extraEnvVars', type=str, help='String of extra arguments to be passed to model.') ...other arguments added to parser... 

Aber wenn ich laufe:

 python Application.py queue -env "-s WHATEVER -e COOL STUFF" 

Es gibt mir:

 Application.py queue: error: argument -env/--extraEnvVars: expected one argument 

Wenn ich den ersten Bindestrich verlasse, funktioniert es ganz gut, aber es ist irgendwie entscheidend, dass ich in der Lage sein kann, in einer Zeichenkette mit Bindestrichen in sie zu gehen. Ich habe versucht, es zu entkommen mit \, was bewirkt, dass es erfolgreich ist, aber fügt die \ zu der Argument-String Kann jemand wissen, wie man um das herum? Dies geschieht, ob oder nicht -s ein Argument im Parser ist.

EDIT: Ich benutze Python 2.7.

EDIT2:

 python Application.py -env " -env" 

Funktioniert ganz gut, aber

 python Application.py -env "-env" 

nicht.

EDIT3: Sieht aus wie das ist eigentlich ein Bug, der bereits diskutiert wird: http://www.gossamer-threads.com/lists/python/bugs/89529 , http://python.6.x6.nabble.com/issue9334- Argparse-does-not-accept-options-take-arguments-beginn-mit-dash-regression-from-optp-td578790.html . Es ist nur in 2.7 und nicht in optparse.

EDIT4: Der aktuelle offene Fehlerbericht lautet: http://bugs.python.org/issue9334

3 Solutions collect form web for “Kann nicht argparse, um zitierte Zeichenfolge mit Bindestrichen darin zu lesen?”

Sie können das Argument mit einem Raum python tst.py -e ' -e blah' als eine sehr einfache Workaround starten. Einfach lstrip() die Option, um es wieder normal, wenn Sie lstrip() .

Oder wenn das erste "Sub-Argument" nicht auch ein gültiges Argument für die ursprüngliche Funktion ist, dann solltest du gar nichts tun müssen. Das ist der einzige Grund, dass python tst.py -e '-s hi -e blah' nicht funktioniert ist, weil -s ist eine gültige Option zu tst.py

Auch das optparse- Modul, das jetzt veraltet ist, funktioniert problemlos.

Aktualisierte Antwort:

Sie können ein Gleichheitszeichen setzen, wenn Sie es nennen:

 python Application.py -env="-env" 

Ursprüngliche Antwort:

Ich habe auch Schwierigkeiten getan, was du zu tun versuchst, aber es gibt einen Workaround, der in argparse gebaut wird, was die parse_known_args Methode ist. Dies lässt alle Argumente, die Sie nicht definiert haben, durch den Parser gehen mit der Annahme, dass Sie sie für einen Teilprozess verwenden würden. Die Nachteile sind, dass Sie keine Fehlerberichterstattung mit schlechten Argumenten erhalten, und Sie müssen sicherstellen, dass es keine Kollision zwischen Ihren Optionen und den Optionen Ihres Unterprozesses gibt.

Eine andere Möglichkeit könnte sein, den Benutzer zu zwingen, ein Plus anstelle eines Minus zu verwenden:

 python Application.py -e "+s WHATEVER +e COOL STUFF" 

Und dann änderst du das '+' zu '-' in der Nachbearbeitung vor dem Übergang zu deinem Teilprozess.

Dieses Thema wird ausführlich in http://bugs.python.org/issue9334 diskutiert. Die meisten der Aktivitäten waren im Jahr 2011. Ich habe ein Patch im letzten Jahr, aber es gibt ganz einen Rückstand von argparse Patches.

Bei der Frage ist die potentielle Mehrdeutigkeit in einer Zeichenkette wie '--env' oder "-s WHATEVER -e COOL STUFF" wenn es einer Option folgt, die ein Argument annimmt.

optparse macht eine einfache links nach rechts parse. Die erste --env ist eine Option Flagge, die ein Argument, so dass es verbraucht die nächste, unabhängig davon, wie es aussieht. argparse , auf der anderen Seite, Schleifen durch die Saiten zweimal. Zuerst kategorisiert man sie als 'O' oder 'A' (Optionsflag oder Argument). Auf der zweiten Schleife verbraucht sie sie, indem sie ein ähnliches Muster anpassen, um Variable nargs Werte zu behandeln. In diesem Fall sieht es so aus, als hätten wir OO , zwei Fahnen und keine Argumente.

Die Lösung bei der Verwendung von argparse ist, um sicherzustellen, dass ein Argument-String nicht für ein Options-Flag verwechselt wird. Möglichkeiten, die hier gezeigt wurden (und in der Fehlerproblematik), umfassen:

 --env="--env" # clearly defines the argument. --env " --env" # other non - character --env "--env " # space after --env "--env one two" # but not '--env "-env one two"' 

Von selbst '--env' sieht aus wie eine Fahne (auch wenn zitiert, siehe sys.argv ), aber wenn gefolgt von anderen Saiten ist es nicht. Aber "-env one two" hat Probleme, weil es als ['-e','nv one two'] , ein `'-e' Flag gefolgt von einem String (oder noch mehr Optionen) analysiert werden kann.

-- und nargs=argparse.PARSER kann auch verwendet werden, um argparse zu zwingen, alle folgenden Zeichenfolgen als Argumente argparse . Aber sie arbeiten nur am Ende der Argumentlisten.

Es gibt einen vorgeschlagenen Patch in issue9334, um einen args_default_to_positional=True Modus hinzuzufügen. In diesem Modus klassifiziert der Parser nur Strings als Optionsflags, wenn er sie mit definierten Argumenten eindeutig übereinstimmen kann. So würde – ein "in" –env – eins "als Argument eingestuft werden. Aber das zweite '–env' in '–env –env' würde noch als Optionsflagge klassifiziert.

  • Erstellen einer CLI (Shell?) In Python
  • Wie können Ruby und Python ihre interaktiven Konsolen implementieren?
  • Ruf einen EDITOR (vim) aus einem Python-Skript auf
  • SQLite Data Change Notification Callbacks in Python oder Bash oder CLI
  • Python ist die beste Programmiersprache der Welt.