【问题标题】:How to create Argument Parser如何创建参数解析器
【发布时间】:2018-12-02 13:37:09
【问题描述】:

我是 python 中 argparser 的新手。我正在尝试为包含两个函数downloadupload 的文件创建argparser 文件上/从框。根据我正在尝试为该文件创建解析器,它一次只会执行一项功能,如下所示,但它不适用于我:

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'

【问题讨论】:

  • 您能否更清楚地解释您的 NOTE 段落?很难跟上
  • 您可以努力发表评论并提出更多问题,而不是投反对票。因为我认为argsparser 文档对于新手来说更容易理解。
  • @khelwood,谢谢兄弟!因为我想要两个选项-df(下载文件)和-uf(上传文件)一次只有一个。 -fp(文件路径)对于-df-uf 都是必需的。选项-fn(文件名)和-fi(文件id)将取决于-df-uf,如果-df那么只有-fi是选项并且它是强制性的,如果-uf那么只有-fn 是选项,它是强制性的。

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


【解决方案1】:

正如所写,所有 5 个参数都是 required - 你已经明确表示了。如果那是你真正想要的,那么剩下的问题都是无关紧要的。无论如何,您都必须提供所有 5 个。

但是 cmets 表明您想使用 -df-uf,但可能不会同时使用两者(尽管这点不清楚)。

虽然在argparse 中有一个mutually_exclusive_mechanism,但没有等效的inclusive - 表示如果存在-f,则还必须给出-g

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

另一种选择是将-df 设置为采用2 个参数(nargs=2),即boxfile

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

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

例如

 if args.download is not None:    # not default
     <check for `args.filename`> etc

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

关于风格。带有- 的短选项标志通常是单个字符。 -d-u 等。只有在这种情况下才能将多个字符串组合成一个字符串,例如-df foo。在这种情况下,这可能无关紧要,因为您的论点都不是store_true

【讨论】:

    【解决方案2】:

    我对 argparse 不是很熟悉,但是通过阅读文档,我认为没有办法使用 mutually_exclusive_grouprequired 来强制执行此操作。似乎需要条件语句或等效语句来确认传递了有效的参数组合。

    见:Python Argparse conditionally required arguments

    【讨论】:

      【解决方案3】:

      我建议你摆脱这些争论中的大部分,也许是全部,并考虑标准的 Unix 做事方式。

      考虑 scp,它的语法为:scp source destination

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

      如果您不提供目的地,则表明您希望文件被称为相同的东西,并在此处着陆,因此这两个东西是等价的:

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

      当然,scp 可以与互联网上的机器通信,所以有一种格式:

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

      如果你正在上传,你可以简单地切换顺序:

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

      【讨论】:

      • 喜欢第一句话!
      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 2022-01-16
      • 2011-04-18
      • 2015-11-15
      • 2012-04-25
      • 1970-01-01
      • 2013-12-11
      • 2023-03-16
      相关资源
      最近更新 更多