【问题标题】:Create arg string from ArgumentParser parsed args in Python在 Python 中从 ArgumentParser 解析的 args 创建 arg 字符串
【发布时间】:2018-05-29 18:30:51
【问题描述】:

如果我有一个argparser.ArgumentParser,加上一个从parser.parse_args 返回的命名空间,有没有一种简单的方法可以将命名空间转换回 argv 列表,以便可以将它们传递回程序?本质上,parse_args 有反函数吗?

一个示例场景:

parser = argparse.ArgumentParser()
parser.add_argument('--example', type=int, default=0)
args = parser.parse_args(argv)

args.example *= 2
new_argv = parser.generate_argv(args)

所以如果我打电话:

python my_program.py --example 1

我想回来:

new_argv = ['--example', '2']

【问题讨论】:

  • 我认为没有;参数的type 可以是任意转换函数,您必须为每个转换函数创建一个逆函数。
  • 你想达到什么目的?您不能更直接地访问您想要调用的任何内容吗?
  • 这能回答你的问题吗? argparse - Build back command line

标签: python argparse


【解决方案1】:

我想这个问题以前有人问过,虽然我不确定一个好的搜索词。

argparse - Build back command line(通过搜索 argparse 和 sys.argv 找到)

在我们深入探讨这个问题之前,让我们先明确一点。 args=parser.parse_args()args=parser.parse_args(sys.argv[1:]) 相同。但我可以想象你想知道sys.argv[1:] 会产生一些任意args 的情况。也许是为了测试,也许是为了驱动别人的代码。

argparse 中没有任何代码可以做到这一点。但是对于有限的情况,您可以从定义的操作中获取信息,并创建一个合理的sys.argv

In [432]: parser = argparse.ArgumentParser()    
In [433]: parser.add_argument('--example', type=int, default=0)
Out[433]: _StoreAction(option_strings=['--example'], dest='example', nargs=None, const=None, default=0, type=<type 'int'>, choices=None, help=None, metavar=None)

定义的动作列表:

In [435]: parser._actions
Out[435]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
 _StoreAction(option_strings=['--example'], dest='example', nargs=None, const=None, default=0, type=<type 'int'>, choices=None, help=None, metavar=None)]

选择一个感兴趣的,看看它的一些属性:

In [436]: a1=parser._actions[-1]
In [437]: a1.type
Out[437]: int
In [438]: a1.default
Out[438]: 0

现在生成args:

In [439]: args=parser.parse_args(['--example','1'])    
In [440]: args
Out[440]: Namespace(example=1)
In [441]: args.example *= 2

使用新的args 和来自操作的信息创建列表的简单示例。显然,工作代码需要推断要使用哪个动作。对于最常见的类型,str() 就足够了。

In [442]: if args.example != a1.default:
   .....:     print(['--example',str(args.example)])
   .....:     
['--example', '2']

或者我可以使用metavar 属性和usage 格式化程序:

In [445]: a1.metavar=str(args.example)
In [446]: parser.print_usage()
usage: ipython2.7 [-h] [--example 2]

【讨论】:

    【解决方案2】:

    我最终遇到了需要这个的情况,这是我的解决方案。它假定您知道预期的位置参数。绝对不是万无一失,但它对我有用。

    def simulate_args_from_namespace(n, positional=[]):
        """ check an argparse namespace against a module's get_args method.
        Ideally, there would be something built in to argparse, but no such luck.
        This tries to reconstruct the arg list that argparse.parse_args would expect
        """
        arg_list = [[k, v] for k, v in sorted(vars(n).items())]
        argparse_formatted_list = []
        for l in arg_list:
            ####  deal with flag arguments (store true/false)
            if l[1] == True:
                argparse_formatted_list.append("--{}".format(l[0]))
            elif l[1] == False or l[1] is None:
                pass  # dont add this arg
            # add positional argments
            elif l[0] in positional:
                argparse_formatted_list.append(str(l[0]))
            # add the named arguments
            else:
                argparse_formatted_list.append("--{}".format(l[0]))
                argparse_formatted_list.append(str(l[1]))
        return argparse_formatted_list
    

    【讨论】:

      【解决方案3】:

      从 parser.parse_args(args) 中删除 args

      args[1] == 示例

      args[2] == 字符串编号

      args.example == int number

      from sys import argv
      parser = argparse.ArgumentParser()
      parser.add_argument('--example', type=int, default=0 )
      args = parser.parse_args()
      print ([argv[1],args.example*2])
      

      然后

      python my_program.py --example 1
      >>>['--example', 2]
      

      【讨论】:

      • 我正在寻找一个普遍的答案,而不是这个特定示例的答案。
      • @BenMorris 你到底需要什么? :D
      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 2021-08-26
      • 2022-01-03
      • 2014-06-18
      • 1970-01-01
      • 2017-10-22
      • 2011-09-11
      • 2021-10-29
      相关资源
      最近更新 更多