如何让argparse显示一个包含两个名称的python脚本的帮助页?

2024-04-29 21:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前使用的python脚本使用getopts,因为它是对使用Getopt::Long的perl脚本的重写。我想迁移到argparse,但是失败了,因为这些选项不能很好地适应argparse的工作方式

然后我有了一个好主意[?],如果我的脚本有两个名字,例如:foo ssh&;foo rsync公司

并且symlink foo rsync to foo ssh(超过90%的脚本是foo ssh,rsync选项是一个附加组件,不能很好地作为一个选项),然后让脚本中的代码只处理它所运行的特定名称的选项

我知道有关subparser,但这看起来并不完全像我所寻找的,并产生了一个更丑陋和混乱的帮助输出比我开始

如果我尝试用argparse尽可能接近getopts方式,我会得到以下结果:

usage: foo-ssh [-h] [--version] [--debug] [--forward-agent HOST:PORT]
                [--ipv4] [--knock HOST:PORT]
                [--libvirt-vnc HOST:PORT | --rsync]
                [USER@]HOST

这是错的,是对的,但是错了

从perl脚本帮助页:

Usage: foo-ssh <options> [USER@]HOST
       foo-ssh <options> --knock HOST:PORT [USER@]HOST
       foo-ssh <options> --libvirt-vnc HOST:PORT [USER@]HOST
       foo-ssh <options> --rsync -- <rsync options> [USER@]HOST:/path/file.name /tmp

我想要的是:

usage: foo-ssh [-h] [--version] [--debug] [--forward-agent HOST:PORT]
                [--ipv4] [--knock HOST:PORT] 
                [--libvirt-vnc HOST:PORT]
                [USER@]HOST
       foo-rsync [OPTION...] [USER@]HOST:SRC... [DEST]
       foo-rsync [OPTION...] SRC... [USER@]HOST:DEST

首先,我是在打一匹死马吗?如果我使用相同数量的代码或更多的代码来替换已经在工作的代码,那么整个练习是没有意义的

第二,这是可能的吗?我在寻找什么来实现它

脚注:Perl代码示例没有包括在内,因为它像河马一样用自己的粪便标记自己的领地(即:到处都是),这是重写的原因之一


Tags: 代码脚本hostfooport选项argparsevnc
1条回答
网友
1楼 · 发布于 2024-04-29 21:17:51

检查sys.argv[0]的值以查看在哪个名称下调用脚本,然后构造适当的ArgumentParser作为响应

if sys.argv[0].endswith("foo-ssh"):
    parser = ArgumentParser(epilog="For rsync, run foo-rsync")
    parser.add_argument(...)
    ...
elif sys.argv[0].endswith("foo-rsync"):
    parser = ArgumentParser(epilog="For ssh, run foo-ssh")
    parser.add_argument(...)
else:
    sys.exit("Must be invoked as foo-ssh or foo-rsync, not {}".format(sys.argv[0]))

args = parser.parse_args()

(如果epilog将落在“折叠之下”,则将对另一个脚本的引用放在description中。)

相关问题 更多 >