Después de cambiar de optparse a argparse - Estoy experimentando errores extraños. Argparse analizar args sólo si no dejar ningún espacio:Python: cambio de optparse a argparse
myScript.py -oOpt
o poner un signo igual:
myScript.py -o=Opt
y no funciona de la forma habitual:
myScript.py -o Opt
Aquí es mi argparse inicialización :
#!/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
Editar:
Aún más:
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 &
da:
gmx_bk-simulate-mems.py: error: unrecognized arguments: 2
parece que argparse
trata 2&>
como opción (o 2&>
y ../date +%Y-%b-%d-%H%M%S.log
como opciones)!
Editar 2:
Entonces, para resumir:
Para
argparse
-"-4.5.5-double_non-parallel_gcc"
es un nombre de opción malo - y es por eso que se requiere para escribir es como-w="-4.5.5-double_non-parallel_gcc"
. Paraoptparse
ybash
(!) Esto está bien.bash
incluso da un error al-w="-4.5.5-double_non-parallel_gcc"
- cree que el argumento es="-4.5.5-double_non-parallel_gcc"
(!);No existe tal cosa como
2&>
.2>
debería ser usado y no da errores;Esto es
shell
que divide la línea en args, nopython
;argparse
es mucho mejor queoptparse
.
Poniendo tu código en 'tmp.py', tanto' python tmp.py -w3' como 'python tmp.py -w 3' imprime '3' para mí. – chepner
@chepner: sí lo hace ... En realidad, el problema da la línea 75 en [gmx_bk-get-results.bash] (https://github.com/bk322/bk-bio/blob/master/gmx_bk-get-results .bash): si uno elimina '=' de esa línea - el script da error - como si no le diera '" $ wW "'. Para poder reproducir uno también se necesita obtener [bk-copies-from-dirs.py] (https://github.com/bk322/bk-goodies/blob/master/bk-copies-from-dirs.py) y [gmx_bk-cpt2gmx.py] (https://github.com/bk322/bk-bio/blob/master/gmx_bk-cpt2gmx.py) ... Todo funcionaba bien en 'optparse'. Espero que alguien vea el problema "teóricamente". – Adobe
comentario pedante: no necesita el verificador de versión. Si usa Python 3, la instrucción de impresión en la parte inferior causará un error de sintaxis y el script ni siquiera se cargará. Si usa Python 2.6 o posterior, la secuencia de comandos fallará al importar 'argparse', incluso antes de llegar a la verificación de versión. – HardlyKnowEm