【发布时间】:2016-11-01 18:00:15
【问题描述】:
如何使用带有变量 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
没有参数,它仍然没有打印任何东西。
【问题讨论】:
-
当我运行它并修复无效语法时,我没有得到
None。你使用的是什么版本的 Python?我已经尝试过 3.5.1 和 2.7.11 并且在两个版本中都可以使用。你需要一个minimal reproducible example。 -
另外,我认为
len(args.dos) > 1不会像您认为的那样做。它会检查您是否输入了超过 1 位的数字。 -
你试过
print(args)直接看解析了什么吗? -
您现在需要一个可以处理字符串“12”的测试,而不是列表或数字。一个字符串。
-
只使用
--dos而没有它应该做什么?