如何创建参数解析器

时间:2018-06-23 06:51:20

标签: python python-2.7 command-line-arguments argparse

我是python中的argparser的新手。我试图为文件创建argparser,该文件包含/从框中包含两个函数downloadupload的文件。根据我正尝试按如下方式为该文件创建解析器的功能,它一次只能执行一项功能,但对我不起作用:

parser = argparse.ArgumentParser(description='Download or Upload file on box.')
    parser.add_argument('-df', '--download', required=True,
                        help='download file box')
    parser.add_argument('-uf', '--upload', nargs='+', required=True,
                        help='upload file of box')
    parser.add_argument('-fp', '--filepath', required=True,
                        help='file path to upload(which file to upload) or download(where to download file)')
    parser.add_argument('-fn', '--filename', required=True,
                        help='what should be the name of file on box')
    parser.add_argument('-fi', '--fileid', required=True,
                        help='file id of file to download from box')

    args = vars(parser.parse_args())

注意:-每次只有-df-uf选项出现时,-fp对于这两个选项都是强制性的,如果为-df那么-fi是唯一的选择,并且是强制性的;如果-uf那么-fn是唯一的选择,并且是强制性的。

如何实现此目的,下面是示例如何将参数传递给文件

pyhton abc.py -df -fp 'Download/boxfile/xyz.txt' -fi 123

python abc.py -uf -fp 'Download/boxfile/xyz.txt' -fn 'qwe.txt'

3 个答案:

答案 0 :(得分:1)

我对argparse并不十分熟悉,但是从阅读文档中我不相信有一种方法可以使用mutually_exclusive_grouprequired来强制这样做。似乎有必要使用条件语句或等效语句来确认是否传递了有效的参数组合。

请参阅:Python Argparse conditionally required arguments

答案 1 :(得分:1)

我建议您摆脱大多数(也许全部)论点,并考虑标准的Unix处事方式。

考虑scp,其语法为: scp 源目标

例如:scp下载/boxfile/xyz.txt qwe.txt

如果您不提供目的地,则表明您希望将文件称为同一事物,然后将其放在此处,因此这两件事是等效的:

scp Download/boxfile/xyz.txt xyz.txt
scp Download/boxfile/xyz.txt

当然,scp可以与Internet上的计算机通信,因此有一种格式:

scp hostname:Download/boxfile/xyz.txt xyz.txt

如果要上传,则只需切换顺序:

scp xyz.txt hostname:Download/boxfile/xyz.txt

答案 2 :(得分:1)

按照书面说明,所有5个参数均为required-您已明确指定。如果那是您真正想要的,那么其余所有问题都不相关。无论如何,您都必须提供全部5个。

但是注释表明您想使用-df-uf,但可能两者都不用(尽管不清楚)。

尽管mutually_exclusive_mechanism中有argparse,但没有inclusive等效项-表示如果存在-f,则-g必须也被给予。

但是可以使用subparsers机制。您可以定义一个download子解析器,并带有必需的-fi参数。还有一个upload,带有自己的参数。

另一种选择是将-dfnargs=2都设为2个参数(box

如果file-df是互斥的,为什么不使用相同的参数作为文件名?也就是说,将-uf-fn替换为一个-fi参数。

另一种选择是使所有(或大部分)参数都不是必需的,并在解析后检查是否有正确的组合。在您自己的代码中实现复杂的逻辑要比强制file为您完成代码容易。

例如

argparse

为可选参数提供默认值也是一个好主意。这样,即使用户没有提供所有项目,代码也可以运行。

关于样式的问题。带有 if args.download is not None: # not default <check for `args.filename`> etc 的短选项标志通常是单个字符。 --d等。只有在这种情况下,才能将多个字符串合并为一个字符串。 -u。在这种情况下,可能没有关系,因为您的参数都不是-df foo