Vorrei fare queste invocazioni di myprog e non altre.come rendere l'argomento opzionale in python argparse
$ python3 myprog.py -i infile -o outfile
$ python3 myprog.py -o outfile
$ python3 myprog.py -o
$ python3 myprog.py
In particolare, desidero rendere illegale specificare l'infile ma non il file di output.
Nel terzo caso, si presuppone un nome predefinito per il file di uscita, "out.json." Nel secondo, terzo e quarto caso, viene assunto un nome predefinito per il file di input, "file.n.json", dove n è un numero di versione intero. Nel quarto caso il file di output sarebbe "file.n + 1.json" dove n + 1 è un numero di versione uno più grande di quello sul file di input. La sezione del mio codice è:
import argparse
parser = argparse.ArgumentParser(description="first python version")
parser.add_argument('-i', '--infile', nargs=1, type=argparse.FileType('r'), help='input file, in JSON format')
parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), default='out.json', help='output file, in JSON format')
args = parser.parse_args()
print("Here's what we saw on the command line: ")
print("args.infile",args.infile)
print("args.outfile",args.outfile)
if args.infile and not args.outfile:
parser.error("dont specify an infile without specifying an outfile")
elif not args.infile:
print("fetching infile")
else: # neither was specified on the command line
print("fetching both infile and outfile")
Il problema è che, quando si esegue
$ python3 myprog.py -i infile.json
invece che l'errore parser che speravo, ottengo:
Here's what we saw on the command line:
args.infile [<_io.TextIOWrapper name='infile.json' mode='r' encoding='UTF-8'>]
args.outfile <_io.TextIOWrapper name='out.json' mode='w' encoding='UTF-8'>
fetching both infile and outfile
... il che suggerisce che anche se non c'era alcun "-o" sulla riga di comando, funzionava come se ci fosse.
Qual è la differenza tra il 3 ° e il 4 ° caso? cosa significa il -o? –
Il quarto caso utilizza nomi di file di estensione e di file predefiniti (in particolare file.n.json e file.n + 1.json, ovvero i file con numeri di versione incorporati). Questi sono diversi da "out.json", che è ciò che causerebbe il terzo caso con l'opzione "-o". Ho modificato il testo sopra per indicare questo. – user1416227
Come si suppone che il quarto caso funzioni come opzione '--input' non ha un valore predefinito? – maxschlepzig