【问题标题】:is there a way to clear python argparse?有没有办法清除 python argparse?
【发布时间】:2013-09-18 19:56:14
【问题描述】:

考虑以下脚本:

import argparse
parser1 = argparse.ArgumentParser()
parser1.add_argument('-a')
args1 = parser1.parse_args()

parser2 = argparse.ArgumentParser()
parser2.add_argument('-b')
args2 = parser2.parse_args()

我有几个问题:

  1. parse_args 是一次性方法还是有办法清除 添加新参数之前的参数? (例如类似的东西 args1.clear()parser1.clear())
  2. 此脚本的结果不可用。虽然这个脚本接受 -a 参数,它不接受 'a' 的任何值。也没有 接受任何-b 参数。有什么方法可以使任何论点真正起作用吗?
  3. 这是我的实际情况:我有 2 个脚本。两者导入相同 具有初始化代码的文件(加载配置文件,创建 loggers 等),我们称之为 init.py 这个 init.py 文件也解析 参数只是因为它需要一个值。问题 是我需要一个脚本来接受其他参数。 由于 init.py 使用一个参数做某事,我不能等待 解析参数。我怎样才能让它发挥作用?

编辑:

这是我的脚本的输出:

[提示]# python2.7 myscript.py -a

用法:a.py [-h] [-a A]

myscript.py:错误:参数 -a:预期一个参数

[提示]# python2.7 myscript.py -a 1

命名空间(a='1')

用法:a.py [-h] [-b B]

myscript.py:错误:无法识别的参数:-a 1

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    你的场景很不清楚,但我猜你要找的是parse_known_args

    这里我猜你是从其他文件中调用了init.py,比如caller1.pycaller2.py

    还假设init.py 只解析-a 参数,而原始脚本将解析其余部分。

    你可以这样做:

    init.py 中把这个放到do_things 方法中:

    parser = argparse.ArgumentParser()
    parser.add_argument('-a')
    parsed = parser.parse_known_args(sys.argv)
    print 'From init.py: %s' % parsed['a']
    

    caller1.py:

    init.do_things(sys.argv)
    parser = argparse.ArgumentParser()
    parser.add_argument('-b')
    parsed = parser.parse_known_args(sys.argv)
    print 'From caller1.py: %s' % parsed['b']
    

    如果你调用caller1.py如下:python caller1.py -a foo -b bar,结果会是:

    From init.py: foo
    From caller1.py: bar
    

    但如果您的情况实际上不是这样,我建议使用@Michael0x2a 答案,这只是在caller1.py 中使用单个ArgumentParser 对象并将值适当地传递给init.py

    【讨论】:

    • 这太棒了!正是我需要的。谢谢!
    【解决方案2】:
    1. 这并没有真正的意义,因为对于所有意图和目的,解析器对象都是无状态的。没有什么需要明确的,因为它所做的只是接受控制台参数,并返回一个 Namespace 对象(一个伪字典),而无需在此过程中修改任何内容。

      因此,您可以认为parse_args() 是幂等的。您可以一遍又一遍地重复调用它,并且会出现相同的输出。默认情况下,它将从 sys.argv 读取参数,这是存储控制台参数的位置。

      但是,请注意,您可以通过将列表传递给 parse_args 函数来输入自定义参数,以便解析器使用除 sys.argv 之外的其他内容作为输入。

    2. 我不确定你的意思。如果您调用python myscript.py -a 15args1 将等于Namespace(a='15')。然后您可以执行args1['a'] 来获得15 的值。如果您想使标志充当切换,请调用parser.add_argument('-a', action='store_true')。这是所有可用操作的a list

    3. 我会尝试将所有控制台/接口代码限制在一个模块和一个解析器中。基本上,删除将命令行从 init.py 和第二个文件解析为独立的小部分的代码。运行解析器后,它为程序中的所有内容提供了一个统一的接口,将适当的变量传递给init.py 中的函数。这样做还有一个额外的好处,那就是保持 UI 独立并且更容易与其余代码互换。

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2011-10-29
      相关资源
      最近更新 更多