【问题标题】:Forcing an argument to be a valid path强制参数成为有效路径
【发布时间】:2018-11-22 06:01:11
【问题描述】:

我正在编写一个简单的脚本,用于解析存储在 AWS CloudWatch 上的 JSON 文件的内容。我在脚本中添加了一个参数解析器,它将接受用户输入,并允许用户将文件的输出打印到屏幕上(以预定的方式),或者允许他们将内容输出到本地 JSON 文件.这是让我难过的东西的sn-p:

import argparse

parser = argparse.ArgumentParser(description="Process a log file")
parser.add_argument('-o', '--output', choices=[???, 'print'], 
                    default='print', help='Specify logfile output path or print to screen')
args = parser.parse_args()

我的问题源于parser.add_argument 行,特别是choices 参数。我想为这个标志允许两个输入,它们是print 或本地机器上的一些有效路径。我希望当前用问号标记的选项是 Python 可以识别的 PATH。

有没有办法使用 argparse 来指定标志的参数之一必须是 PATH?到目前为止,搜索结果尚无定论。

提前致谢!

【问题讨论】:

  • choices 的值可以是任何字符串列表。我建议使用os 函数来获取有效路径列表,根据需要对其进行操作,添加“打印”,然后设置add_argument。另一种选择是接受任何字符串(没有选择),并在解析后进行测试。
  • 在我看来,你不应该使用choices 选项。有一个功能可以检查路径是否有效(see here)。对我来说,你应该只检查你收到的标志的值。正如你应该总是做的那样。
  • 如果列表很长,choices 将成为问题 - 帮助中的显示和错误消息变得混乱。

标签: python path argparse


【解决方案1】:

定义自定义type(如https://stackoverflow.com/a/14117511/1093967),其中值可以是有效路径或'print'choices 在这里不是正确的选择。

【讨论】:

    【解决方案2】:

    使用type keyword argumentadd_argument,而不是choices。正如文档所说:

    add_argument() 的 type 关键字参数允许任何必要的 要执行的类型检查和类型转换。

    def myfiletype(arg):
        if arg == 'print' or os.path.isdir(arg):
            return arg
        else:
            raise ValueError('Invalid path specification')
    
    
    parser.add_argument('-o', '--output', type=myfiletype, 
                        default='print', 
                        help='Specify logfile output path or print to screen')
    

    【讨论】:

    • 我喜欢你使用type参数的方式。
    • 如果您想传递自定义错误消息,请使用 argparse.ArgumentTypeErrorargparse 将忽略您的 ValueError 消息。
    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2017-01-01
    • 2013-07-14
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多