Python 根据初始参数的值向argparse添加参数
我知道以前也有人问过类似的问题,但我真的找不到一个确切的问题(此外,我不理解“nargs”或“subparse”的概念,以及它如何适用于我的案例) 我想要像这样的东西:Python 根据初始参数的值向argparse添加参数,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我知道以前也有人问过类似的问题,但我真的找不到一个确切的问题(此外,我不理解“nargs”或“subparse”的概念,以及它如何适用于我的案例) 我想要像这样的东西: parser = argparse.ArgumentParser() parser.add_argument('-mode', choices=['download', 'upload'], required=True) parser.add_argument('-d', required=True) args = parser
parser = argparse.ArgumentParser()
parser.add_argument('-mode', choices=['download', 'upload'], required=True)
parser.add_argument('-d', required=True)
args = parser.parse_args()
if args.mode == 'download':
parser.add_argument('-f', required=True)
args = parser.parse_args()
因此,只有当-mode
为下载时,才需要-f
参数,否则不应对其进行分析这是怎么回事
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-mode', choices=['download', 'upload'], required=True)
parser.add_argument('-d', required=True)
parser.add_argument('-f')
args = parser.parse_args()
if args.mode == 'download' and not args.f:
parser.error('-f argument is required in "download" mode.')
演示:
通常,您应该避免使--选项成为必需的。在这种情况下,我建议如下:
用子命令替换--mode
用位置参数替换-d
仅将-f
替换为下载
命令的第二个位置参数
如果确实需要,可以保留-d
和-f
,而不是将它们作为位置参数
您的电话如下所示:
./script.py upload d-argument
./script.py download d-argument f-argument
或
要实现的代码有点乏味,但相当简单
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
upload_parser = subparsers.add_parser('upload')
download_parser = subparsers.add_parser('download')
upload_parser.set_defaults(cmd='upload')
download_parser.set_defaults(cmd='download')
for p in [ upload_parser, download_parser ]:
p.add_argument("d")
# p.add_argument("-d", required=True)
download_parser.add_argument("f")
# download_parser.add_argument("-f", required=True)
args = parser.parse_args()
if args.cmd == 'upload':
# handle upload with args.d
elif args.cmd == 'download':
# handle download with args.d and args.f
请注意,对set\u defaults
的调用用于在最终解析的参数中标记使用了哪个命令。argparse
没有相互包含的参数,这就是您所说的。相反,您应该既不需要-d
也不需要-f
,而是在用法消息中包含必须同时指定两者或两者都不指定的事实,然后检查以确保同时指定了-d
和-f
,如果两者都是。您可以使用,这样,download
就变成了一个子命令,它有自己的一组(必需)标志。太好了,谢谢。我不确定这种情况是否只发生在我的python版本(3.5)中,但我需要检查cmd
中的args
,以防用户调用脚本时没有cmd
。如果调用脚本时没有位置参数,argparse
本身将引发错误。否则,第一个参数将用于cmd
。
./script.py upload -d foo
./script.py download -d foo -f bar
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
upload_parser = subparsers.add_parser('upload')
download_parser = subparsers.add_parser('download')
upload_parser.set_defaults(cmd='upload')
download_parser.set_defaults(cmd='download')
for p in [ upload_parser, download_parser ]:
p.add_argument("d")
# p.add_argument("-d", required=True)
download_parser.add_argument("f")
# download_parser.add_argument("-f", required=True)
args = parser.parse_args()
if args.cmd == 'upload':
# handle upload with args.d
elif args.cmd == 'download':
# handle download with args.d and args.f