【发布时间】:2012-04-22 00:00:19
【问题描述】:
从 optparse 切换到 argparse 后 - 我遇到了奇怪的错误。 argparse 仅在不留空格时才解析 args:
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"处给出错误 - 它认为 arg 是="-4.5.5-double_non-parallel_gcc"(!);没有
2&>这样的东西。2>应该可以使用并且不会出错;这是
shell将行拆分为 args,而不是python;argparse比optparse好很多。
【问题讨论】:
-
将您的代码放入
tmp.py,python tmp.py -w3和python tmp.py -w 3都为我打印'3'。 -
@chepner: 是的,确实如此...实际上,问题在gmx_bk-get-results.bash 中给出了第75 行:如果从该行中删除
=- 脚本给出错误 - 好像我没有给出它"$wW"。为了重现一个还需要得到bk-copies-from-dirs.py 和gmx_bk-cpt2gmx.py...在optparse上一切正常。我希望有人会从“理论上”看到这个问题。 -
迂腐评论:您不需要版本检查器。如果使用 Python 3,底部的 print 语句会导致语法错误,甚至不会加载脚本。如果您使用 Python 2.6 或更低版本,脚本将在导入
argparse时失败,甚至在您进行版本检查之前。 -
不过,这是一个非常有趣的问题,思考它教会了我一些关于
argparse的新东西。感谢分享!
标签: python shell command-line-arguments argparse optparse