可变长度参数

时间:2016-09-28 15:38:31

标签: python python-3.x argparse

我正在使用argparse module创建一个python程序,我想让程序接受一个参数或两个参数。

我的意思是什么?好吧,我正在创建一个下载/解码MMS消息的程序,我希望用户能够提供电话号码和MMS-Transaction-ID来下载数据或从他们已下载的MMS数据系统中提供文件。

我想要的是这样的,你可以输入2个参数或1个参数:

./mms.py (phone mmsid | file)

注意:phone是一个电话号码(如15555555555),mmsid是一个字符串(MMS-Transaction-ID),file是一个文件用户的计算机

argparse这可能吗?我希望我可以使用add_mutually_exclusive_group,但这似乎没有做我想要的。

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('phone', help='Phone number')
group.add_argument('mmsid', help='MMS-Transaction-ID to download')
group.add_argument('file', help='MMS binary file to read')

这给出了错误(删除required=True会产生相同的错误):

  

ValueError:互斥参数必须是可选的

看起来它希望我使用--phone代替phone

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--phone', help='Phone number')
group.add_argument('--mmsid', help='MMS-Transaction-ID to download')
group.add_argument('--file', help='MMS binary file to read')

在没有参数的情况下运行我的程序时,我看到:

  

错误:其中一个参数--phone --mmsid --file是必需的

这更接近我想要的,但我可以argparse(--phone --msid) or (--file)吗?

1 个答案:

答案 0 :(得分:4)

这有点超出了argparse可以做的范围,因为第一个参数的“类型”未提前知道。我会做类似

的事情
import argparse

p = argparse.ArgumentParser()
p.add_argument("file_or_phone", help="MMS File or phone number")
p.add_argument ("mmsid", nargs="?", help="MMS-Transaction-ID")

args = p.parse_args()

要确定args.file_or_phone是用作文件名还是电话号码,您需要检查args.mmsid是否为None