0

考虑以下脚本:

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()or parser1.clear()
  2. 这个脚本的结果是不可用的。尽管此脚本接受-a参数,但它不接受 'a' 的任何值。它也不接受任何-b论据。有什么方法可以使任何论点真正起作用吗?
  3. 这是我的实际情况:我有 2 个脚本。两者都导入具有初始化代码(加载配置文件,创建记录器等)的相同文件,我们将其称为 init.py 这个 init.py 文件也只解析参数,因为它需要一个值。问题是我还需要其中一个脚本来接受其他参数。由于 init.py 用一个参数做某事,我不能等待 parse_args。我怎样才能让它工作?

编辑:

这是我的脚本的输出:

[提示]# 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

4

2 回答 2

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')。这是所有可用操作的列表

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

于 2013-09-18T06:17:45.667 回答
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.py按以下方式调用:python caller1.py -a foo -b bar,结果将是:

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

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

于 2013-09-18T06:45:10.100 回答