【问题标题】:Saving python argparse file保存python argparse文件
【发布时间】:2019-03-12 13:37:47
【问题描述】:

Argparse 有一个名为 fromfile-prefix-chars 的功能,它似乎只完成了我正在寻找的一半。如何从当前命令行参数创建此功能的文件?

我有一个复杂的脚本,其中包含一个自动生成部分代码的解析器。用例是第一次正确设置命令行,然后基本上使用相同的参数重新运行。

使用文件并从中加载似乎是实现我需要的好方法。似乎缺少的是一种将初始命令行写入文件的简单方法,以便现有文件解析能够正常工作。

【问题讨论】:

    标签: python argparse


    【解决方案1】:
    from argparse import ArgumentParser
    import json
    
    parser = ArgumentParser()
    parser.add_argument('--seed', type=int, default=8)
    parser.add_argument('--resume', type=str, default='a/b/c.ckpt')
    parser.add_argument('--surgery', type=str, default='190', choices=['190', '417'])
    args = parser.parse_args()
    
    with open('commandline_args.txt', 'w') as f:
        json.dump(args.__dict__, f, indent=2)
    
    parser = ArgumentParser()
    args = parser.parse_args()
    with open('commandline_args.txt', 'r') as f:
        args.__dict__ = json.load(f)
    
    print(args)
    

    【讨论】:

      【解决方案2】:

      文件格式记录得很清楚:

      默认情况下,从文件中读取的参数必须是每行一个 [...]

      文档中的代码示例显示他们编写了一个中间有换行符的文件:

      >>> with open('args.txt', 'w') as fp:
      ...     fp.write('-f\nbar')
      

      如果要保存当前命令行,只需将sys.argv[1:] 写入文件,参数之间使用换行符:

      with open('commandline_args.txt', 'w') as f:
          f.write('\n'.join(sys.argv[1:]))
      

      演示:

      >>> from argparse import ArgumentParser
      >>> import sys
      >>> parser = ArgumentParser(fromfile_prefix_chars='@')
      >>> parser.add_argument('--foo')
      _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
      >>> parser.add_argument('bar', nargs='?')
      _StoreAction(option_strings=[], dest='bar', nargs='?', const=None, default=None, type=None, choices=None, help=None, metavar=None)
      >>> sys.argv[1:] = ['--foo', 'spam', 'barbaz']
      >>> parser.parse_args()
      Namespace(bar='barbaz', foo='spam')
      >>> with open('commandline_args.txt', 'w') as f:
      ...     f.write('\n'.join(sys.argv[1:]))
      ...
      17
      >>> parser.parse_args(['@commandline_args.txt'])
      Namespace(bar='barbaz', foo='spam')
      >>> sys.argv[1:] = ['--foo=spam', 'barbaz']  # using alternate syntax
      >>> parser.parse_args()
      Namespace(bar='barbaz', foo='spam')
      >>> with open('commandline_args.txt', 'w') as f:
      ...     f.write('\n'.join(sys.argv[1:]))
      ...
      17
      >>> parser.parse_args(['@commandline_args.txt'])
      Namespace(bar='barbaz', foo='spam')
      

      【讨论】:

      • 我觉得没那么简单。见stackoverflow.com/a/25084994/169296。您的解决方案会将标志和标志的值分成两行。
      • @BrettStottlemyer:是的,没关系。请注意,文档中的代码示例正是如此
      • @BrettStottlemyer:请注意,它们也是 sys.argv 中的单独参数条目。你要么有'--option=foo'(一个字符串`或'--option''foo'sys.argv列表中。
      • @BrettStottlemyer:最后但同样重要的是,请注意,您链接到文件的问题没有分成单独的行。如果--option1foo 位于不同的行您在开关和值之间使用=,则该问题会起作用。
      • @BrettStottlemyer:我添加了一个演示会话,显示了这两种形式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多