После переключения с optparse на argparse - я испытываю странные ошибки. Argparse анализирует аргументы, только если не оставить пробела:
myScript.py -oOpt
или поставить знак равенства:
myScript.py -o=Opt
и это не работает обычным способом:
myScript.py -o Opt
Вот моя инициализация 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
Изменить :
Даже больше:
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 &
дает:
gmx_bk-simulate-mems.py: error: unrecognized arguments: 2
похоже, что argparse
рассматривает 2&>
как вариант (или 2&>
и .../date +%Y-%b-%d-%H%M%S.log
как опции)!
Редактировать 2:
Итак, резюмируем:
Для argparse
- "-4.5.5-double_non-parallel_gcc"
- плохое имя параметра - и поэтому требуется писать как -w="-4.5.5-double_non-parallel_gcc"
. Для optparse
и bash
(!) это нормально. bash
даже выдает ошибку -w="-4.5.5-double_non-parallel_gcc"
- думает, что аргумент ="-4.5.5-double_non-parallel_gcc"
(!);
Нет такой вещи, как 2&>
.2>
можно использовать и это не даст ошибок
Это shell
разбивает строку на args, а не python
;
argparse
намного лучше, чем optparse
.