Python,argparse。怎么样-opt1 -part-of-opt1 ?

问题描述 投票:0回答:2
parser.add_argument('-i', required=True)  # One directory path
parser.add_argument('-d', required=True)  # Output database path
parser.add_argument('-t', required=True)  # DDL-script path
parser.add_argument('-c -i', required=True) # Another directory path

我像这样运行.py脚本:

python.exe s.py -c -i D:\Temp\dir1 -d D:\Temp\out.db -t D:\Temp\ddl.sql -i D:\Temp\dir2

并得到错误:

usage: s.py [-h] -i I -d D -t T -c -i C _I
s.py: error: argument -c -i: expected one argument

如何在没有重命名参数名称的情况下使用它?

python python-3.x argparse
2个回答
2
投票

看看sys.argv[1:]列表。我希望它会

['-c', '-i', 'D:\Temp\dir1', '-d', 'D:\Temp\out.db', '-t', 'D:\Temp\ddl.sql', '-i', 'D:\Temp\dir2']

请注意,'-c -i'是分开的。因为允许使用缩写,所以-c被接受为'-c -i'标志的缩写。但该字符串后跟'-i'和'D:......'。这是两个论点,而不仅仅是一个。因此错误。

是的,您可以引用“-c -i”,因此shell不会拆分它,但即使这样也不能正常工作。我没有看到指定这样的标志的任何意义。它不是基于先前定义的'-i'Action。

In [113]: parser.parse_args(['-c -i', 'D:\Temp\dir1', '-d', 'D:\Temp\out.db', 
   '-t', 'D:\Temp\ddl.sql', '-i', 'D:\Temp\dir2'])
Out[113]: Namespace(d='D:\\Temp\\out.db', i='D:\\Temp\\dir2', 
   t='D:\\Temp\\ddl.sql', **{'c _i': 'D:\\Temp\\dir1'})
In [122]: getattr(Out[113],'c _i')
Out[122]: 'D:\\Temp\\dir1'

1
投票

要详细说明user2357112的评论,这个“复合名称”不是一个东西。在我的头脑中,我无法命名单个程序的单个标志来执行此操作。

即使你设法实现这一点(没有什么是不可能的,虽然argparse几乎没有帮助),但这个设计决定对你的程序用户来说是非常令人畏惧的。

© www.soinside.com 2019 - 2024. All rights reserved.