Python:从optparse切换到argparse

前端之家收集整理的这篇文章主要介绍了Python:从optparse切换到argparse前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从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',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',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好多了.

解决方法

首先,有必要进行小的区分. argparse模块不解析命令行参数,shell也是如此. shell负责将您在shell中键入的行转换为标记,然后将标记传递给sys.argv,这是一个python数组/命令行参数序列. argparse模块只是理解sys.argv中出现的内容.

这种区别将澄清您注意到的两个“错误”.首先,考虑-w“-4.5.5-double_non-parallel_gcc”(注意缺少等号). shell将这两个标记解析为-w和-4.5.5-double_non-parallel_gcc,并将这两个字符串传递给sys.argv.没有等号,这似乎是两个选项:-w(没有参数)和-4,以.5.5-double_non-parallel_gcc作为参数.您需要等号,以便将所有内容解析为单个令牌.

编辑部分

对于2&>,argparse不可能控制给定的令牌是否被视为参数.如果sys.argv中出现某些内容,则表示您的shell将其视为参数.

这里的告示标志是错误消息.请注意,消息不是无法识别的参数:2&>,而是无法识别的参数:2.您的shell识别“&>”作为输出重定向,并相应地解析该行的其余部分(包括日志文件).传递的唯一参数是“2”,因为2&>不是真正的重定向类型. (&>已经涵盖了stderr和stdout,那么2会添加什么?)

评论中,您声称optparse可以“处理”“2&>”.事实并非如此. optparse模块完全与argparse完成的工作相同,但optparse不会像argparse那样验证位置参数.事实上,optparse正在让一个真正的编程错误(在这种情况下,使用2&>作为一种shell重定向)无法检测到!您应该发布原始的optparse代码,但我怀疑您解析了您的参数,如下所示:

opt,args = parser.parse_args()

你的脚本没有位置参数,所以我想你之后没有做任何其他的args.但是如果你要检查args,你会发现2被认为是位置参数!

通常,如果脚本不使用位置参数并且您使用optparse,则最好验证您没有收到位置参数,args = parser.parse_args() if args: parser.error("script takes no positional arguments")

argparse模块可以为你工作,这使得它远远超过optparse(以及其他原因).

猜你在找的Python相关文章