社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Robert Spencer • 5 年前 • 1556 次点击  

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

然后我有了一个聪明的主意?],如果脚本有两个名称,例如:foo ssh&foo rsync

和symlink foo rsync to 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代码示例没有包括在内,因为它写得像河马,用自己的粪便标记自己的领地(即:到处都是),这是重写的原因之一。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56506
 
1556 次点击  
文章 [ 1 ]  |  最新文章 5 年前
chepner
Reply   •   1 楼
chepner    5 年前

检查的值 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()

(将对另一个脚本的引用放入 description 如果 epilog