Ich würde gerne wissen, wie Python Argparse-Modul zum Lesen von Argumenten sowohl aus der Befehlszeile und möglicherweise aus Textdateien verwenden. Ich kenne Argarses fromfile_prefix_chars
, aber das ist nicht genau das, was ich will. Ich möchte das Verhalten, aber ich will nicht die Syntax. Ich möchte eine Schnittstelle, die wie folgt aussieht:wie argarse zu lesen Argumente aus einer Datei mit einer Option anstelle von Präfix
$ python myprogram.py --foo 1 -A somefile.txt --bar 2
Wenn argparse -A sieht, sollte es aufhören von sys.argv lesen oder was auch immer ich es geben, und rufen Sie eine Funktion, die ich schreiben, dass liest somefile.text und Rückkehr eine Liste von Argumenten. Wenn die Datei erschöpft ist, sollte sie mit der Analyse von sys.argv oder was auch immer weitermachen. Es ist wichtig, dass die Verarbeitung der Argumente in der Datei der Reihe nach erfolgt (dh: -foo sollte verarbeitet werden, dann die Argumente in der Datei, dann -bar, damit die Argumente in der Datei überschrieben werden können --foo, und - Bar könnte überschreiben, was in der Datei ist).
Ist so etwas möglich? Kann ich eine benutzerdefinierte Funktion schreiben, die neue Argumente in den Stapel von argparse schiebt?
Was würde in Ihrer Version die spezielle Behandlung eines Arguments (anstelle eines Präfixzeichens) auslösen? – martineau
@martineau: die "-A" -Option sagt "das nächste Argument ist eine Datei, die gelesen werden soll". Ich muss in der Lage sein, meine eigene Funktion zu schreiben, diese Datei zu lesen und die Argumente zurückzugeben (es ist nicht in einem Ein-Argument-pro-Zeile-Format) –
Blick auf die [Quelle von _parse_known_args] (https: //hg.python. org/cpython/file/3.4/Lib/argparse.py # l1769), es sieht so aus, als würde argparse alle Argumente von vorn kennen. Wenn Sie @from_prefix_chars gesetzt haben, dann sieht es sich die Argumente an und erstellt eine vollständig neue Liste zum Parsen (_read_args_from_files). Ich denke, Ihre beste Option ist, sys.argv im Voraus zu parsen, um die Liste der Argumente zu erhalten. – mgilson