Wenn die Befehlszeile ist wie folgt:
myprog --input a.txt --mode r --input c.txt --mode a --input b.txt
Es ist in Ordnung, einige Code wie folgt hinzuzufügen:
import argparse
parser = argparser.ArgumentParser()
parser.add_argument('--input', action='append')
parser.add_argument('--mode', action='append')
args = parser.parse_args()
args_dict = vars(args)
Dann können Sie die args analysieren Objekt, args_dict variabel.Der Wert ist wie folgt:
$ python test.py --input test.txt --mode w --input test3.txt --input test2.txt --mode a
{'mode': ['w', 'a'], 'input': ['test.txt', 'test3.txt', 'test2.txt']}
Sie beide laufen können ‚Eingang‘ Schlüssel und ‚mode‘ Schlüssel in den args_dict Variable, für die weiterhin die Eingabeliste (es ist ‚test2.txt‘ hier), können Sie es mit 'r' Modus öffnen.
Aber wenn Ihre Befehlszeile so etwas wie zu schreiben:
myprog --input a.txt --mode r --input b.txt --input c.txt --mode a
Ich glaube nicht, es ist einfach, die b.txt mit ‚r‘ Modus zu analysieren, weil argparse nicht wissen, welchen Modus binde an den relativen Eingang ...
lassen Sie sich inspiriert von @mgilson ‚s Kommentar und Antwort, ich habe eine andere Art und Weise zu definieren Aktion Unterklasse gefunden, und macht die ‚mode‘ Eingang nützlich.
class ExtendReadOnlyAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
inputs = namespace.input
modes = getattr(namespace, self.dest)
if modes is None:
modes = []
modes.extend(['r' for i in range(len(inputs) - len(modes))])
modes[-1] = values
setattr(namespace, self.dest, modes)
Und der Client-Code so etwas wie das sein kann:
import argparse
parser = argparser.ArgumentParser()
parser.add_argument('--input', action='append')
parser.add_argument('--mode', action=ExtendReadOnlyAction)
args = parser.parse_args()
args_dict = vars(args)
Dann können wir die args Objekt analysieren, mehr args_dict Variable einfacher. Wenn die Befehlszeile ist wie folgt:
$ python test.py --input test.txt --mode w --input test2.txt --input test3.txt --mode a
Das Ergebnis wird sein:
{'mode': ['w', 'r', 'a'], 'input': ['test.txt', 'test2.txt', 'test3.txt']}
Im besonderen Art und Weise, wenn die Befehlszeile wie folgt lautet:
$ python test.py --input test.txt --mode w --input test2.txt --input test3.txt --input test4.txt
Das Ergebnis wird sein:
{'input': ['test.txt', 'test2.txt', 'test3.txt', 'test4.txt'], 'mode': ['w']}
Und die Wenn Sie das dict einfacher parsen können, wird die 'test2.txt ~ test4.txt' im Eingabeargument den Standardmodus 'r' haben :)
Wenn Sie pycharm verwenden, können Sie Befehlszeilenargumente mit Einstellungen angeben. –
Also, was ist die Frage? –
Gewährleisten Sie, dass für jeden "- Eingang" ein entsprechender '- Modus' vorliegt? Wenn ja, dann könntest du einfach die 'append'-Aktion sowohl auf" input "als auch auf" mode "anwenden und dann die Listen" zippen ". Wenn nicht (wie es in Ihrem Fall der Fall ist), dann werden die Dinge viel schwieriger, wenn Sie nicht bereit sind, die Befehlszeile neu zu strukturieren - z. 'myprog --input a.text r --input b.txt --input c.txt a ...' – mgilson