【问题标题】:Using 'argparse' as opposed to sys.argv使用 'argparse' 而不是 sys.argv
【发布时间】:2012-08-31 21:30:26
【问题描述】:

我的脚本当前使用sys.argv 来检查提供给程序的输入文件。

我正在尝试改用argparse,但我似乎无法让它工作。我能够设置它并添加一个参数,但是当我解析一个参数并打印该解析的参数时,我得到了一个命名空间。我怎样才能得到一个字符串?基本上,我想将参数作为一个字符串,并打开一个具有该名称的文件。

目前,我的sys.argv 是:

filename = sys.argv[1]
f = open(filename, 'r')

我的argparse 打印出Namespace,如下所示:

arg = parser.parse_args()
print arg

如何使用它来打开文件?我想使用argparse,因为参数的错误处理要容易得多。

【问题讨论】:

    标签: python argparse argv


    【解决方案1】:

    认为使用with 语句打开文件更可取(或其他东西!),如下所示:

    # printfile.py
    import argparse
    
    parser = argparse.ArgumentParser(description="Opens a file and does cool stuff ^^")
    parser.add_argument('filename', type=str, help="Path to file to open")
    args = parser.parse_args()
    
    with open(args.filename) as f:
        print '   my uber cool file:'
        print f.readlines()
    

    指定这些关键字参数也有助于制作漂亮的 -h 帮助文本选项(非常整洁)

    [dlam@dlam-63221:~] $ python printfile.py -h
    usage: printfile.py [-h] filename
    
    Opens a file and does cool stuff ^^
    
    positional arguments:
        filename    Path to file to open
    

    【讨论】:

    • 这实际上解决了我要问的错误处理问题(使用with 语句)。谢谢!
    • with 是一个上下文管理器。它保证(我认为解释器本身存在分段错误)当您退出上下文时(即使有异常),用于创建上下文的对象将正确完成。换句话说,您的文件将被正确关闭,并且无论发生什么,这些资源都将被释放。
    【解决方案2】:

    打印arg,后跟一个点,然后是您在argparse 设置中分配给参数的任何名称。

    例子:

    parser = argparse.ArgumentParser(description = 'Title you want')
    parser.add_argument('-f', action = "store", dest = "fflag", type = str, help = "Filename to be used, stdin is default")
    

    在这种情况下,文件名将在命令行上以-f 开头,并且可以通过str 类型的parser.fflag 访问

    【讨论】:

    • 那么 argparse 基本上把所有的参数都放在字典里了?此外,这样做并打印文件返回:<open file 'test', mode 'r' at 0x1004e46f0>。这是否意味着该文件已被 argparse 打开?
    • @Darksky - 它实际上是一个自定义对象,而不是一个普通的字典。如果您将 arg 作为文件键入,那么它将方便地为您提供一个已经打开的文件对象。如果需要,您可以键入 is 作为 str 并返回一个没有文件验证的字符串。
    • doughellmann.com/PyMOTW/argparse 这是我找到的一个很好的教程。如果您希望稍后在程序中允许访问,您基本上设置您的参数并将它们分配给变量。我会用一个例子来更新我的答案。
    猜你喜欢
    • 2015-07-09
    • 2016-05-23
    • 2012-01-15
    • 2011-03-14
    • 1970-01-01
    • 2020-08-06
    • 2019-07-03
    • 2015-09-28
    • 2021-08-01
    相关资源
    最近更新 更多