Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.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/1/angular/29.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_Argparse - Fatal编程技术网

在不带任何参数的情况下调用脚本时,使用python argparse显示帮助消息

在不带任何参数的情况下调用脚本时,使用python argparse显示帮助消息,python,argparse,Python,Argparse,这可能是一个简单的问题。假设我有一个使用argparse处理命令行参数/选项的程序。以下内容将打印“帮助”消息: ./myprogram -h 或: 但是,如果我在没有任何参数的情况下运行脚本,它不会做任何事情。我想要它做的是在没有参数的情况下调用它时显示用法消息。这是怎么做到的?这个答案来自史蒂文·贝沙德。我把它重新发布在这里是为了让没有谷歌账户的人更容易访问 您可以覆盖error方法的默认行为: import argparse import sys class MyParser(argp

这可能是一个简单的问题。假设我有一个使用argparse处理命令行参数/选项的程序。以下内容将打印“帮助”消息:

./myprogram -h
或:


但是,如果我在没有任何参数的情况下运行脚本,它不会做任何事情。我想要它做的是在没有参数的情况下调用它时显示用法消息。这是怎么做到的?

这个答案来自史蒂文·贝沙德。我把它重新发布在这里是为了让没有谷歌账户的人更容易访问

您可以覆盖
error
方法的默认行为:

import argparse
import sys

class MyParser(argparse.ArgumentParser):
    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        self.print_help()
        sys.exit(2)

parser = MyParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()

请注意,只要出现
错误
方法被触发。例如,
test.py--blah
将打印帮助消息 如果
--blah
不是一个有效的选项,也是如此

如果要仅在上未提供参数时打印帮助消息 命令行,那么也许这仍然是最简单的方法:

import argparse
import sys

parser=argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
if len(sys.argv)==1:
    parser.print_help(sys.stderr)
    sys.exit(1)
args=parser.parse_args()


请注意,
parser.print\u help()
默认情况下打印到标准输出。使用
parser.print\u help(sys.stderr)
打印到stderr。

可以使用try/except代替编写类

try:
    options = parser.parse_args()
except:
    parser.print_help()
    sys.exit(0)
好处是工作流更清晰,不需要存根类。缺点是第一行“用法”会打印两次


这至少需要一个强制参数。如果没有强制参数,在命令行上提供零参数是有效的。

使用argparse,您可以执行以下操作:

parser.argparse.ArgumentParser()
#parser.add_args here

#sys.argv includes a list of elements starting with the program
if len(sys.argv) < 2:
    parser.print_usage()
    sys.exit(1)
parser.argparse.ArgumentParser()
#parser.add_参数在此
#sys.argv包含以程序开头的元素列表
如果len(系统argv)<2:
parser.print_用法()
系统出口(1)

将我的版本扔到这里:

import argparse

parser = argparse.ArgumentParser()
args = parser.parse_args()
if not vars(args):
    parser.print_help()
    parser.exit(1)

您可能会注意到
parser.exit
-我主要是这样做的,因为如果这是文件中出现
sys
的唯一原因,它会保存一个导入行

如果要运行脚本,必须指定参数-请为ArgumentParser使用required参数,如下所示:-

parser.add_参数('--foo',required=True)

如果脚本在没有任何参数的情况下运行,parse_args()将报告错误。

如果您为(子)解析器关联了默认函数,如下面所述,您只需将其添加为默认操作:

parser.print_help()
parser.exit()
parser=argparse.ArgumentParser()
parser.set_默认值(func=lambda x:parser.print_用法())
args=parser.parse_args()
args.func(args)

如果由于缺少位置参数而引发异常,请添加try except。

使用nargs设置位置参数,并检查位置参数是否为空

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file', nargs='?')
args = parser.parse_args()
if not args.file:
    parser.print_help()
parser.print_help()
parser.exit()

参考

最干净的解决方案是,如果命令行中没有给出默认参数,则手动传递默认参数:

parser.parse_args(args=None if sys.argv[1:] else ['--help'])
完整示例:

import argparse, sys

parser = argparse.ArgumentParser()
parser.add_argument('--host', default='localhost', help='Host to connect to')
# parse arguments
args = parser.parse_args(args=None if sys.argv[1:] else ['--help'])

# use your args
print("connecting to {}".format(args.host))
如果调用了w/o参数,这将打印完整的帮助(而不是简短的用法)

parser.print_help()
parser.exit()

parser.exit
方法还接受一个
状态(returncode>)和一个
消息值(包括一个尾随的换行符!)

一个固执己见的例子, :)

电话示例:

$ python3 ~/helloworld.py; echo $? usage: helloworld.py [-h] [--example] Example argparser based python file optional arguments: -h, --help show this help message and exit --example Example Argument Something went wrong, --example condition was not set 64 $ python3 ~/helloworld.py --example; echo $? 0 $python3~/helloworld.py;回声$? 用法:helloworld.py[-h][--示例] 基于argparser的python文件示例 可选参数: -h、 --帮助显示此帮助消息并退出 --示例参数 出了点问题,没有设置示例条件 64 $python3~/helloworld.py——示例;回声$? 0
下面是另一种方法,如果您需要一些灵活的方法,希望在传递特定参数时显示帮助,则完全没有或超过1个冲突参数:

import argparse
import sys

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-d', '--days', required=False,  help="Check mapped inventory that is x days old", default=None)
    parser.add_argument('-e', '--event', required=False, action="store", dest="event_id",
                        help="Check mapped inventory for a specific event", default=None)
    parser.add_argument('-b', '--broker', required=False, action="store", dest="broker_id",
                        help="Check mapped inventory for a broker", default=None)
    parser.add_argument('-k', '--keyword', required=False, action="store", dest="event_keyword",
                        help="Check mapped inventory for a specific event keyword", default=None)
    parser.add_argument('-p', '--product', required=False, action="store", dest="product_id",
                        help="Check mapped inventory for a specific product", default=None)
    parser.add_argument('-m', '--metadata', required=False, action="store", dest="metadata",
                        help="Check mapped inventory for specific metadata, good for debugging past tix", default=None)
    parser.add_argument('-u', '--update', required=False, action="store_true", dest="make_updates",
                        help="Update the event for a product if there is a difference, default No", default=False)
    args = parser.parse_args()

    days = args.days
    event_id = args.event_id
    broker_id = args.broker_id
    event_keyword = args.event_keyword
    product_id = args.product_id
    metadata = args.metadata
    make_updates = args.make_updates

    no_change_counter = 0
    change_counter = 0

    req_arg = bool(days) + bool(event_id) + bool(broker_id) + bool(product_id) + bool(event_keyword) + bool(metadata)
    if not req_arg:
        print("Need to specify days, broker id, event id, event keyword or past tickets full metadata")
        parser.print_help()
        sys.exit()
    elif req_arg != 1:
        print("More than one option specified. Need to specify only one required option")
        parser.print_help()
        sys.exit()

    # Processing logic here ...

干杯

有一对带有
sys.argv[1://code>(一个非常常见的Python习语,用于引用命令行参数,即脚本名
sys.argv[0]
)的单行程序可以完成此任务

第一个是不言自明的、干净的、通俗的:

args = parser.parse_args(None if sys.argv[1:] else ['-h'])
第二个有点粗糙。将先前评估的空列表为
False
这一事实与
True==1
False==0
等价物相结合,可以得到以下结果:

args = parser.parse_args([None, ['-h']][not sys.argv[1:]])
可能括号太多了,但如果选择了先前的参数,则非常清楚

_, *av = sys.argv
args = parser.parse_args([None, ['-h']][not av])

如果您的命令是用户需要选择某个操作的,则使用相互排斥的组和required=True

这是对pd321给出的答案的一种扩展

import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--batch", action='store', type=int,  metavar='pay_id')
group.add_argument("--list", action='store_true')
group.add_argument("--all", action='store_true', help='check all payments')

args=parser.parse_args()

if args.batch:
    print('batch {}'.format(args.batch))

if args.list:
    print('list')

if args.all:
    print('all')
输出:

$python3 a_test.py
用法:a_test.py[-h](-batch pay_id |--list |--all)
a_test.py:error:其中一个参数--batch--list--all是必需的

这只提供基本的帮助。其他一些答案会给你充分的帮助。但是,至少您的用户知道他们可以执行-h这并不好(也因为拦截所有错误),但是:

def_错误(解析器):
def包装器(拦截器):
parser.print_help()
系统出口(-1)
返回包装器
def_args_get(args=sys.argv[1:]):
parser=argparser.ArgumentParser()
parser.error=\u错误(解析器)
parser.add_参数(…)
...
下面是
ArgumentParser
类的
error
函数的定义:

。如您所见,在签名之后,它包含两个参数。但是,类之外的函数不知道第一个参数:
self
,因为粗略地说,这是类的参数。(我知道,您知道…)因此,只需在
中传递自己的
self
消息
。\u错误(…)
无法(

将输出:

...
"AttributeError: 'str' object has no attribute 'print_help'"
)。您可以在
\u error
函数中通过调用
解析器(
self
)来传递它:

def _error(self, message):
    self.print_help()

    sys.exit(-1)

def _args_get(args=sys.argv[1:]):
    parser = argparser.ArgumentParser()

    parser.error = _error(parser)
    ...
...
,但您不想立即退出该程序。然后退回:

def _error(parser):
    def wrapper():
        parser.print_help()

        sys.exit(-1)

    return wrapper
...
。尽管如此,
解析器
不知道它已被修改,因此当发生错误时,它将发送错误原因(由wa
def _error(parser):
    def wrapper():
        parser.print_help()

        sys.exit(-1)

    return wrapper
...
def _error(parser):
    def wrapper(interceptor):
        parser.print_help()

        sys.exit(-1)

    return wrapper
...
#!/usr/bin/env python3
Description = """Tool description"""
Epilog  = """toolname.py -a aflag -b bflag  with these combined it does blah"""
arg_parser = argparse.ArgumentParser(
    formatter_class=argparse.RawDescriptionHelpFormatter,
    description=Description, 
    epilog=Epilog,
)
    try:
        if len(sys.argv) == 1:
            arg_parser.print_help()
    except Exception as e:
        print(e)