Dopo il passaggio da optparse a argparse, si verificano strani errori. Argparse analizzare args solo se non lasciano spazio:Python: passaggio da optparse a argparse
myScript.py -oOpt
o mettere un segno di uguale:
myScript.py -o=Opt
e non funziona il modo normale:
myScript.py -o Opt
Ecco la mia inizializzazione argparse :
#!/usr/bin/env python
# to get description use the -h flag
import argparse, os, sys
# ======================
# Python2.7 is expected:
if sys.version_info[0] != 2 or sys.version_info[1] < 7:
sys.exit('This program needs Python2.7+')
# ==========
# preambule:
desc = """Enter dirs in the current dir and makes gro out of state.cpt there."""
# parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser(description=desc, version='2.3', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-w', '--workWith',
help = 'to specify a Gromacs exec suffix',
dest = 'wW',
action = 'store',
default = '-4.5.5-single',
)
parser.add_argument('-g', '--gro',
help = '.gro postfix: <nameOfTheDir><postfix>.gro',
dest = 'myGroPostfix',
action = 'store',
default = "_membrane",
)
parser.add_argument('-H', '--here',
help = 'toggles - single (current) dir behaviour (the output will be state.gro)',
dest = 'Here',
action = 'store_true',
)
parser.add_argument('-D', '--dirs',
help = 'include these dirs (python\'s rgxp in SINGLE quotes), defaults to \'\'',
dest = 'inclDirs',
action = 'store',
default = '',
)
args = parser.parse_args()
print args.wW
Edit:
Ancor più:
gmx_bk-simulate-mems.py -j bk-runs-mpi.bash -p 1 -w="-4.5.5-double_non-parallel_gcc" 2&> ../`date +%Y-%b-%d-%H%M%S`.log &
dà:
gmx_bk-simulate-mems.py: error: unrecognized arguments: 2
sembra argparse
tratta 2&>
in opzione (o 2&>
e ../date +%Y-%b-%d-%H%M%S.log
come opzioni)!
Edit 2:
Quindi, per riassumere:
Per
argparse
-"-4.5.5-double_non-parallel_gcc"
è un nome di opzione male - ed è per questo che è necessario per scrivere è come-w="-4.5.5-double_non-parallel_gcc"
. Peroptparse
ebash
(!) Questo va bene.bash
restituisce anche un errore a-w="-4.5.5-double_non-parallel_gcc"
- si pensa che l'argomento sia="-4.5.5-double_non-parallel_gcc"
(!);Non esiste una cosa come
2&>
.2>
dovrebbe essere usato e non dà errori;Questo è
shell
chi divide la linea in args, nonpython
;argparse
è molto meglio dioptparse
.
Inserire il codice in 'tmp.py', sia' python tmp.py -w3' che 'python tmp.py -w 3' stampa '3' per me. – chepner
@chepner: sì sì ... In realtà il problema dà la riga 75 in [gmx_bk-get-results.bash] (https://github.com/bk322/bk-bio/blob/master/gmx_bk-get-results .bash): se si rimuove '=' da quella linea - lo script dà errore - come se non gli dessi '" $ wW "'. Per riprodurlo bisogna anche ottenere [bk-copies-from-dirs.py] (https://github.com/bk322/bk-goodies/blob/master/bk-copies-from-dirs.py) e [gmx_bk-cpt2gmx.py] (https://github.com/bk322/bk-bio/blob/master/gmx_bk-cpt2gmx.py) ... Tutto funzionava bene su 'optparse'. Spero che qualcuno vedrà il problema "teoricamente". – Adobe
Commento pedante: non è necessario il correttore di versione. Se si utilizza Python 3, l'istruzione print in basso causerà un errore di sintassi e lo script non verrà nemmeno caricato. Se usi Python 2.6 o versioni precedenti, lo script fallirà con l'importazione di 'argparse', prima ancora di arrivare al controllo della versione. – HardlyKnowEm