当前位置: 首页 > 面试题库 >

如何使python argparse不带前缀的互斥组参数?

耿志义
2023-03-14
问题内容

Python2.7 argparse仅在互斥组中接受可选参数(前缀):

parser = argparse.ArgumentParser(prog='mydaemon')
action = parser.add_mutually_exclusive_group(required=True)
action.add_argument('--start', action='store_true', help='Starts %(prog)s daemon')
action.add_argument('--stop', action='store_true', help='Stops %(prog)s daemon')
action.add_argument('--restart', action='store_true', help='Restarts %(prog)s daemon')

$ mydaemon -h

usage: mydaemon [-h] (--start | --stop | --restart)

optional arguments:
  -h, --help  show this help message and exit
  --start     Starts mydaemon daemon
  --stop      Stops mydaemon daemon
  --restart   Restarts mydaemon daemon

有没有一种方法可以使argparse参数的行为类似于传统的unix守护程序控件:

(start | stop | restart) and not (--start | --stop | --restart) ?

问题答案:

对于其中的所有功能和选项,argparse我认为您永远不会获得看起来像您想要的“罐头”用法字符串。

也就是说,自您的原始帖子起,您是否查看过子解析器?

这是一个准系统的实现:

import argparse

parser = argparse.ArgumentParser(prog='mydaemon')
sp = parser.add_subparsers()
sp_start = sp.add_parser('start', help='Starts %(prog)s daemon')
sp_stop = sp.add_parser('stop', help='Stops %(prog)s daemon')
sp_restart = sp.add_parser('restart', help='Restarts %(prog)s daemon')

parser.parse_args()

使用-h选项运行此命令将产生:

usage: mydaemon [-h] {start,stop,restart} ...

positional arguments:
  {start,stop,restart}
    start               Starts mydaemon daemon
    stop                Stops mydaemon daemon
    restart             Restarts mydaemon daemon

这种方法的好处之一是能够set_defaults用于每个子解析器,以将函数直接连接到参数。我还为stop和添加了“优美”选项restart

import argparse

def my_stop(args):
    if args.gracefully:
        print "Let's try to stop..."
    else:
        print 'Stop, now!'

parser = argparse.ArgumentParser(prog='mydaemon')

graceful = argparse.ArgumentParser(add_help=False)
graceful.add_argument('-g', '--gracefully', action='store_true', help='tries to terminate the process gracefully')
sp = parser.add_subparsers()
sp_start = sp.add_parser('start', help='Starts %(prog)s daemon')
sp_stop = sp.add_parser('stop', parents=[graceful],
                    description='Stops the daemon if it is currently running.',
                    help='Stops %(prog)s daemon')
sp_restart = sp.add_parser('restart', parents=[graceful], help='Restarts %(prog)s daemon')

# Hook subparsers up to functions
sp_stop.set_defaults(func=my_stop)

# Uncomment when my_start() and 
# my_restart() are implemented
#
# sp_start.set_defaults(func=my_start)
# sp_restart.set_defaults(func=my_restart)

args = parser.parse_args()
args.func(args)

显示以下内容的“帮助”消息stop

$ python mydaemon.py stop -h
usage: mydaemon stop [-h] [-g]

Stops the daemon if it is currently running.

optional arguments:
  -h, --help        show this help message and exit
  -g, --gracefully  tries to terminate the process gracefully

停止“优雅地”:

$ python mydaemon.py stop -g
Let's try to stop...


 类似资料:
  • 问题内容: 如果我有参数,那么我的程序只需使用函数中的一个即可。有没有一种方法可以组合起来,以便程序仅接受或? 编辑: 添加一个简单的程序以更清楚: 然后只能被调用。是否可以将argparse组排除在组之外,以便仅被调用? 问题答案: 编辑 :没关系。因为调用时必须创建一个选项,这是一个可怕的选择。那不是我的设计选择。如果您迫切需要此功能,可以尝试使用ConflictsOptionParser来实

  • 问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为

  • 问题内容: 我需要的是: 我尝试了这个,但是没有用。有人可以帮我吗? 谢谢! 问题答案: 不会使整个组互斥。它使组内的选项互斥。 您正在寻找的是子命令。而不是编[-a xxxx | [-b yyy -c zzz]],您将拥有: 要使用第一组参数进行调用: 要使用第二组参数进行调用: 您还可以将子命令参数设置为位置。 有点像git或svn: 工作范例 测试一下 祝好运。

  • 问题内容: 我想使用互斥锁,该互斥锁将用于同步访问内存共享黑白中两个不同进程中的某些变量。我该如何实现。执行该代码示例将不胜感激。 问题答案: 而是 使用初始化为的POSIX信号量 。 (请参见下文)用于未命名的信号灯或已命名的信号灯。 最初发布此答案很多年后,必须对其进行更新。 实际上应该使用互斥对象而不是信号量 。R和kuga的评论(如下逐字复制)解释了原因。特别是,我发现kuga提到互斥锁只

  • 互斥是多线程系统中用于控制访问的一个原对象(primitive object)。下面的例子给出了它最基本的用法: std::mutex m; int sh; //共享数据 // … m.lock(); // 对共享数据进行操作: sh += 1; m.unlock(); 在任何时刻,最多只能有一个线程执行到lock()和unlock()之间的区域(通常称为临界区)。当第一个线程正在临界区执行时