argparse 中的可选 nargs 变量
optional nargs variable in argparse
如何使用带有变量 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)
现在,如果我有变量,那么它会打印一些值,错误但有些值:
$python3 vasp.py --dos 111
111
None # IT SHOULDN'T BE NONE
DOSY
但没有争论。
我也试过正常的 sys.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
我已经尝试了 hpaulj 的建议。它给出:
$python3 tt.py --dos 12
Namespace(dos='12')
1
DOSY
没有参数,它仍然没有打印任何东西。
您需要替换 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)
在 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”,len
为 3,int(args.dos[0])
为数字 1。离开 nargs
时也会发生同样的情况空白(默认 None)。
使用 nargs='?'
我也可以使用不带参数的标志,在这种情况下,值是默认值 None
。
In [1013]: parser.parse_args('--dos'.split())
Out[1013]: Namespace(dos=None)
nargs=
?is most useful with a
const, which gives a convenient 3 way action. I can add
type=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。但是 none 确实解决了我的问题。所以,我采取了其他方式。为了完整起见,我将其张贴在这里。
#!/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)
正确产生预期结果:
$python3 tt.py --dos
DOSY
None
$python3 tt.py --dos -n 222
DOSY
222
如何使用带有变量 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)
现在,如果我有变量,那么它会打印一些值,错误但有些值:
$python3 vasp.py --dos 111
111
None # IT SHOULDN'T BE NONE
DOSY
但没有争论。
我也试过正常的 sys.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
我已经尝试了 hpaulj 的建议。它给出:
$python3 tt.py --dos 12
Namespace(dos='12')
1
DOSY
没有参数,它仍然没有打印任何东西。
您需要替换 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)
在 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”,len
为 3,int(args.dos[0])
为数字 1。离开 nargs
时也会发生同样的情况空白(默认 None)。
使用 nargs='?'
我也可以使用不带参数的标志,在这种情况下,值是默认值 None
。
In [1013]: parser.parse_args('--dos'.split())
Out[1013]: Namespace(dos=None)
nargs=
?is most useful with a
const, which gives a convenient 3 way action. I can add
type=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。但是 none 确实解决了我的问题。所以,我采取了其他方式。为了完整起见,我将其张贴在这里。
#!/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)
正确产生预期结果:
$python3 tt.py --dos
DOSY
None
$python3 tt.py --dos -n 222
DOSY
222