Python 是否可以在没有任何标志的情况下使用argparse?
是否可以在没有任何标志的情况下使用Python 是否可以在没有任何标志的情况下使用argparse?,python,python-3.x,windows,argparse,Python,Python 3.x,Windows,Argparse,是否可以在没有任何标志的情况下使用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 A
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
如果有更好的选择,请告诉我。您可以这样做:
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
来更加明确。您可以这样做:
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
来更加明确。您可以使用
这样做的缺点是它不会显示在帮助中(除非您将其包含在某个位置或修改
帮助格式化程序
)
另一种解决方案是使用具有位置参数的互斥组,该位置参数使用
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
你可以用
这样做的缺点是它不会显示在帮助中(除非您将其包含在某个位置或修改
帮助格式化程序
)
另一种解决方案是使用具有位置参数的互斥组,该位置参数使用
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
python脚本.py1.2.3.4-i5.6.7.8怎么样?我不认为您可以直接在
argparse
中轻松实现这一点,我会考虑对它生成的对象进行后处理。那么python script.py 1.2.3.4-I 5.6.7.8
呢?我不认为您可以直接在argparse
中轻松地执行此操作,我会考虑对它生成的对象进行后处理arguments@SergeBallesta也许你可以多解释一下你想要什么?您可以添加nargs='?'
。我更新了代码。@JohnSzakmeister:对不起,我没有正确阅读你的答案。请忘记(并原谅)我之前的评论。此操作失败,没有任何错误arguments@SergeBallesta也许你可以多解释一下你想要什么?您可以添加nargs='?'
。我更新了代码。@JohnSzakmeister:对不起,我没有正确阅读你的答案。请忘记(并原谅)我之前的评论。很好,+1,这看起来是正确的方式!parse\u known\u arguments()
的另一个缺点是,argparse不会在无法识别的内容上出错。。。它只会传递给你。这可能不是你真正想要的行为。@JohnSzakmeister在Op的MWE中说,他们没有检查IP有效性或任何东西。显然,您将检查长度并解析IP。@GiacomoAlzetta这不是我的意思parse_known_arguments()
将未知选项作为参数传递,而不是错误。这不仅仅是检查IP有效性的问题(没有任何解决方案提供),它还遗漏了argparse可能为您提供的错误处理。我希望这是有道理的。尝试将--foo--bar 1.2.3.4
传递到parse_known_args()
并查看行为。它不会在--foo
和--bar
上出错。。。这让你来处理。围绕另一个工具编写一个包装器很好,但在其他情况下它会有缺陷。@JohnSzakmeister我想你不明白parse\u known\u args
是如何工作的。解析器不知道的参数在结果的第二个元素中提供。正如我所说,完整的解决方案将验证IP,因此--foo
或--bar
将触发验证错误。请注意,您可能要定义一个ipaddress
函数来指定选项的type
,因此您所要做的就是调用它,oyu将得到相同的错误消息。很好,+1,这看起来是正确的方法!parse\u known\u arguments()
的另一个缺点是,argparse不会在无法识别的内容上出错。。。它只会传递给你。这可能不是你真正想要的行为。@JohnSzakmeister在Op的MWE中说,他们没有检查IP有效性或任何东西。显然,您将检查长度并解析IP。@GiacomoAlzetta这不是我的意思parse_known_arguments()
将未知选项作为参数传递,而不是错误。这不仅仅是检查IP有效性的问题(没有任何解决方案提供),它还遗漏了argparse可能为您提供的错误处理。我希望这是有道理的。尝试将--foo--bar 1.2.3.4
传递到parse_known_args()
并查看行为。它不会在--foo
和--bar
上出错。。。这让你来处理。围绕另一个工具编写一个包装器很好,但在其他情况下它会有缺陷。@JohnSzakmeister我想你不明白parse\u known\u args
是如何工作的。解析器不知道的参数在结果的第二个元素中提供。正如我所说,完整的解决方案将验证IP