有没有办法清除python argparse?

时间:2013-09-18 06:05:16

标签: python argparse

考虑以下脚本:

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个脚本。两者导入相同 具有初始化代码的文件(加载配置文件,创建 记录器等),让我们称之为init.py这个init.py文件也解析 这些参数只是因为它需要一个值。问题 是我需要其中一个脚本来接受其他参数。 由于init.py使用一个参数执行某些操作,因此我不能等待 parse_args。我怎样才能使它发挥作用?
  4. 修改

    以下是我的脚本输出:

    [prompt]#python2.7 myscript.py -a

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

    myscript.py:error:参数-a:期望一个参数

    [prompt]#python2.7 myscript.py -a 1

    命名空间(α= '1')

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

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

2 个答案:

答案 0 :(得分: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独立,并且可以更容易地与其余代码互换。

答案 1 :(得分:2)

您的情况尚不清楚,但我想您正在寻找的是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.pypython caller1.py -a foo -b bar,结果将是:

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

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