是否可以使用没有任何标志的argparse
?
例如,每当没有提供标志(在这种情况下为-u
或-i
)时,我希望脚本将第一个参数sys.argv[1]
作为IP地址进行处理。
代码
import argparse, sys
parser = argparse.ArgumentParser()
parser.add_argument('-u')
parser.add_argument('-i')
args = parser.parse_args()
if args.i:
print("IP Address is " + args.i)
elif args.u:
print("URL is " + args.u)
elif len(sys.argv) > 1:
print("IP Address is " + sys.argv[1])
else:
print("No arguments ")
正常输出
C:\>python script.py
No arguments
C:\>python script.py 8.8.8.8
usage: script.py [-h] [-u U] [-i I]
script.py: error: unrecognized arguments: 8.8.8.8
C:\>python script.py -i 8.8.8.8
IP Address is 8.8.8.8
C:\>
即使没有提供标志(-u
或-i
),我的期望输出。
C:\>python script.py 8.8.8.8
IP Address is 8.8.8.8
C:\>python script.py -i 8.8.8.8
IP Address is 8.8.8.8
如果有更好的选择,请告诉我。
答案 0 :(得分:4)
您可以使用ArgumentParser.parse_known_args()
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-u')
parser.add_argument('-i')
args, ip = parser.parse_known_args()
if args.i:
print("IP Address is " + args.i)
elif args.u:
print("URL is " + args.u)
elif ip:
print("IP Address is " + ip[0])
else:
print('No argument provided')
此方法的缺点是它不会显示在帮助中(除非您将其包括在某个地方或修改HelpFormatter
)。
另一种解决方案是将互斥组与使用nargs='?'
的位置参数一起使用:
import argparse, sys
parser = argparse.ArgumentParser()
parser.add_argument('-u')
group = parser.add_mutually_exclusive_group()
group.add_argument('-i')
group.add_argument('ip', nargs='?')
args = parser.parse_args()
if args.i:
print("IP Address is " + args.i)
elif args.ip:
print("IP Address is " + args.ip)
elif args.u:
print("URL is " + args.u)
else:
print('No argument provided')
因此,当尝试同时指定位置参数和-i
时,会出现错误:
$ script.py 2.3.4.5 -i 1.2.3.4
usage: script.py [-h] [-u U] [-i I | ip]
p.py: error: argument -i: not allowed with argument ip
这将显示您可以使用-i IP
或位置参数,尽管对于不习惯命令行的人来说,语法可能有点难以理解:
$ script.py -h
usage: script.py [-h] [-u U] [-i I | ip]
positional arguments:
ip
optional arguments:
-h, --help show this help message and exit
-u U
-i I
答案 1 :(得分:1)
您可以执行以下操作:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', dest='type', action='store_const',
const='ip', default='ip')
parser.add_argument('-u', dest='type', action='store_const',
const='url')
parser.add_argument('location', nargs='?', default=None)
args = parser.parse_args()
if args.location is not None:
if args.type == 'ip':
print("IP Address is " + args.location)
elif args.type == 'url':
print("URL is " + args.location)
else:
print("No argument provided")
在这里,我们使用选项来指定类型并将位置设为必需的参数。该类型将默认为ip
,因此会提供您所需的默认行为,但您可以同时使用-i
和-u
来更明确。