【问题标题】:argparse: how to parse a single string argument OR a file listing many arguments?argparse:如何解析单个字符串参数或列出许多参数的文件?
【发布时间】:2016-09-29 06:51:01
【问题描述】:

我有一个用例,我希望用户能够提供单个字符串或每行都有一个字符串的文件名作为 argparse 的参数。

假设用户启动./myscript.py -i foobar

我正在寻找的逻辑流程是这样的:

脚本判断字符串 foobar 是否为可读文件。 如果它确实是一个可读文件,我们从脚本中调用一些函数,将foobar 中的每一行作为参数传递给该函数。如果 foobar 不是可读文件,我们调用相同的函数,只是使用字符串 foobar 作为参数并返回。

我无法保证文件名参数将具有特定的扩展名(甚至根本没有扩展名)。

除了完全按照我上面描述的那样对逻辑进行编码之外,还有其他更 Pythonic 的方法吗?我查看了argparse tutorial 并没有看到任何东西,但认为文件名作为参数会有一些特定的钩子似乎也是合理的,所以我想我会问。

【问题讨论】:

标签: python argparse


【解决方案1】:

一种方法是:

假设您创建了一个这样的解析器:

parser.add_argument('-i',  
                    help='...', 
                    type=function)

type 指向function,它是一个外部函数,用于评估用户的输入并决定它是string 还是filename

您可以在documentation 中找到有关type 的更多信息。

这是一个演示 type 用法的最小示例:

parser.add_argument('-d','--directory', 
                    type=Val_dir, 
                    help='...')
# ....

def Val_dir(dir):
    if not os.path.isdir(dir):
        raise argparse.ArgumentTypeError('The directory you specified does not seem to exist!')
    else:
        return dir

上面的例子表明,使用type,我们可以在解析时控制输入。当然,在您的情况下,该函数将实现另一个逻辑 - 评估输入是字符串还是文件名。

【讨论】:

    【解决方案2】:

    这看起来不像argparse 问题,因为你想要的只是一个字符串。该字符串可以是文件名或函数参数。对于parser,这些看起来是一样的。 argparse 通常也不用于运行函数。它用于解析命令行。您的代码决定如何处理这些信息。

    所以这是一个我认为可以完成任务的脚本(未经测试):

    import argparse
    def somefunction(*args):
        print(args)
    
    if __name__=='__main__':
        parser=argparse.ArgumentParser()
        parser.add_argument('-i','--input')
        args = parser.parse_args()
    
        try:
            with open(args.input) as f:
                lines = f.read()
                somefunction(*lines)
                # or
                # for line in lines:
                #   somefuncion(line.strip())
        except:
            somefunction(arg.input)
    

    argparse 只提供args.input 字符串。决定如何使用的是 try/except 块。

    =================

    这是一个前缀字符的方法:

    parser=argparse.ArgumentParser(fromfile_prefix_chars='@',
       description="use <prog -i @filename> to load values from file")
    parser.add_argument('-i','--inputs')
    args=parser.parse_args()
    for arg in args.inputs:
         somefunction(arg)
    

    这应该适用于如下文件:

     one
     two 
     three
    

    https://docs.python.org/3/library/argparse.html#fromfile-prefix-chars

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 2012-10-22
      • 2021-07-13
      • 2011-12-22
      • 2012-04-14
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多