加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python:从optparse切换到argparse

发布时间:2020-12-16 23:34:51 所属栏目:Python 来源:网络整理
导读:从optparse切换到argparse后 – 我遇到了奇怪的错误. Argparse仅在不留空间时解析args: myScript.py -oOpt 或者给出一个等号: myScript.py -o=Opt 并且它不能正常工作: myScript.py -o Opt 这是我的argparse初始化: #!/usr/bin/env python# to get descr
从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(以及其他原因).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读