Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在没有任何标志的情况下使用argparse?_Python_Python 3.x_Windows_Argparse - Fatal编程技术网

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