我当前正在使用的python脚本使用getopts,因为它是对使用Getopt :: Long的perl脚本的重写。我想迁移到argparse,但是失败了,因为选项与argparse的工作方式不太吻合。
然后我有了一个聪明的主意[?],如果我的脚本有2个名称,例如foo-ssh和foo-rsync,该怎么办
并且将foo-rsync链接到foo-ssh(超过90%的脚本是foo-ssh,rsync选项是一个不能很好地作为选项的加载项),然后让脚本中的代码仅处理运行它的特定名称的选项。
我了解次级解析器,但这与我要查找的看起来并不完全一样,并且产生的帮助输出比开始时还要更加丑陋和令人困惑。
如果我尝试使用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代码示例,因为它就像河马一样用自己的便便标记了自己的领土(即:到处都是,这是重写的原因之一。
检查sys.argv[0]
的值以查看脚本的名称,然后构造一个合适的ArgumentParser
作为响应。