argpars中的可选nargs变量

2024-06-16 12:36:42 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用变量nargs对argparse执行条件循环?所以,基本上,它应该运行有无争论。 我正在尝试:

parser = argparse.ArgumentParser(description="output parser")
group = parser.add_mutually_exclusive_group()
group.add_argument("--dos", help="get DOSCAR for plot",
                   nargs="?", metavar=("int"))
args = parser.parse_args()

if args.dos:    
    if len(args.dos) > 1:
        chosen = int(args.dos[0])
        chdos = "at_dos"+args.dos[0]+".dat"
    else:
        chosen = None

    inpt = "DOSY"
    print(chosen)
    print(inpt)

现在,如果我有变量,那么它会打印一些值,错误的,但是有些值:

^{pr2}$

但没有任何理由。在

我也试过用普通的系统argv,作为:

def get_dos():
    if len(sys.argv) > 2:
        chosen = int(sys.argv[2])
        chdos = "at_dos"+sys.argv[2]+".dat"
    else:
        chosen = None
    inpt = "DOSCAR"
    print(sys.argv)

    print(args.dos)
    print(chosen)
    print(inpt)

在这种情况下,当有选项时,它给出正确的结果:

python3 vasp.py --dos 12
['vasp.py', '--dos', '12']
12
12
DOSCAR

但同样,没有任何选择:

$python3 vasp.py --dos

我试过接受保罗的建议。它提供:

$python3 tt.py --dos 12
Namespace(dos='12')
1
DOSY

毫无疑问,它仍然没有印刷任何东西。在


Tags: pyparserifsysgroupargspython3int
3条回答

在Ipython会话中简化解析器:

In [1004]: parser=argparse.ArgumentParser()    
In [1005]: parser.add_argument(' dos', nargs='?')

In [1007]: parser.parse_args(' dos 111'.split())
Out[1007]: Namespace(dos='111')

在本例中,args.dos将是字符串“111”,其中len3,而{}是数字1。将nargs留空(默认无)。在

使用nargs='?'我还可以使用不带参数的标志,在这种情况下,值是默认值None。在

^{pr2}$

nargs=is most useful with aconst, which gives a convenient 3 way action. I can addtype=int`将字符串(如果有的话)转换为整数。在

In [1015]: parser.add_argument(' dos', nargs='?', type=int,
   default=None, const=123)

In [1016]: parser.parse_args([]) # not used
Out[1016]: Namespace(dos=None)

In [1017]: parser.parse_args(' dos'.split())  # without argument
Out[1017]: Namespace(dos=123)

In [1018]: parser.parse_args(' dos 456'.split())  # with argument
Out[1018]: Namespace(dos=456)

其他的nargs,比如1,'*'和'+'给你一个列表,你可以检查它的长度等等

=================

在你的argv测试中

if len(sys.argv) > 2:
    chosen = int(sys.argv[2])
    chdos = "at_dos"+sys.argv[2]+".dat"

sys.argv是一个列表,因此如果有足够的元素来应用sys.argv[2]步骤,那么len是计数的。在

这不起作用,因为args.dos是单个字符串,而不是列表。在

if len(args.dos) > 1:
    chosen = int(args.dos[0])
    chdos = "at_dos"+args.dos[0]+".dat"

len(args.dos)是字符串中的字符数,args.dos[0]是第一个字符。在

==========

如果我定义:

def get_dos(argv=None):
    parser=argparse.ArgumentParser()
    parser.add_argument(' dos', type=int, nargs='?')
    args = parser.parse_args(argv)
    chosen = args.dos
    if chosen is not None:
        chdos = 'at_dos%s.dat'%chosen
    else:
        chdos = ''
    return chosen, chdos

这些测试产生的值符合您的需要:

In [1042]: get_dos([])
Out[1042]: (None, '')

In [1043]: get_dos([' dos'])
Out[1043]: (None, '')

In [1044]: get_dos([' dos','123'])
Out[1044]: (123, 'at_dos123.dat')

感谢所有回复的人,特别是@hpaulj。但他们都没有真正解决我的问题。所以,我走了另一条路。我把这个贴在这里是为了完整。在

#!/usr/bin/python3
import argparse

parser = argparse.ArgumentParser(description="output parser")
group = parser.add_mutually_exclusive_group()
group.add_argument(" dos", help="get DOSCAR for plot",action='store_true')
parser.add_argument("-n", help="Showing last n line",
                    metavar='integer', type=int)

args = parser.parse_args()
if args.dos:
    if args.n:
        chosen = int(args.n)
        chdos = "at_dos"+str(args.n)+".dat"
    else:
        chosen = None
    inpt = "DOSY"
    print(inpt)
    print(chosen)

从而产生预期结果:

^{pr2}$

您需要替换nargs=“?”使用nargs=“*”。将nargs设置为“?”表示将有1个可选参数。您需要的是可选参数的列表,即“*”。像这样。在

import argparse
parser = argparse.ArgumentParser(description="output parser")
group = parser.add_mutually_exclusive_group()
group.add_argument(" dos", help="get DOSCAR for plot",
               nargs="*", metavar=("int"))
args = parser.parse_args()

if args.dos:    
    if len(args.dos) > 1:
        chosen = int(args.dos[0])
        chdos = "at_dos"+args.dos[0]+".dat"
    else:
        chosen = None

    inpt = "DOSY"
    print(chosen)
    print(inpt)

相关问题 更多 >