考虑以下脚本:
import argparse
parser1 = argparse.ArgumentParser()
parser1.add_argument('-a')
args1 = parser1.parse_args()
parser2 = argparse.ArgumentParser()
parser2.add_argument('-b')
args2 = parser2.parse_args()
我有几个问题:
args1.clear()
或parser1.clear()
)-a
参数,它不接受'a'的任何值。也不是
接受任何-b
参数。是否有某种方法可以使任何参数真正起作用?修改
以下是我的脚本输出:
[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
答案 0 :(得分:2)
这没有多大意义,因为对于所有意图和目的,解析器对象都是无状态的。没有什么可以清除的,因为它所做的只是接受控制台参数,并返回一个Namespace
对象(一个伪字典)而不需要修改过程中的任何内容。
因此,您可以认为parse_args()
是幂等的。您可以反复重复调用它,并且会发生相同的输出。默认情况下,它将从sys.argv
读取参数,这是存储控制台参数的位置。
但是,请注意,您可以通过将列表传递给parse_args
函数来管道自定义参数,以便解析器将使用sys.argv
之外的其他内容作为输入。
我不确定你的意思。如果您致电python myscript.py -a 15
,args1
将等于Namespace(a='15')
。然后,您可以args1['a']
获取值15.如果您想使该标志充当切换,请致电parser.add_argument('-a', action='store_true')
。以下是所有可用操作的a list。
我会尝试将所有控制台/接口代码限制在一个模块中并放入一个解析器中。基本上,删除代码以将命令行从init.py和第二个文件解析为独立的小部分。运行解析器后,它会为程序中的所有内容提供统一的接口,将适当的变量传递给init.py
内的函数。这样做的另一个好处是可以保持UI独立,并且可以更容易地与其余代码互换。
答案 1 :(得分:2)
您的情况尚不清楚,但我想您正在寻找的是parse_known_args
我猜这里你从其他文件中调用init.py
,说caller1.py
和caller2.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
传递适当的值}