如何使用在运行时更改的python命令行参数?

时间:2013-06-28 21:24:21

标签: python command-line-arguments argparse optparse

我有一个python程序,修改另一个程序的配置文件,然后调用该程序。另一个程序使用配置文件来定义几何,然后将特定电压应用于不同的几何元素。我希望能够在命令行上指定要应用于命名配置元素的电压。例如,配置文件可以指定名为“base”的元件具有1伏的电压,而另一个名为“LeftDot”的元件具有1.4伏的电压。我想要一个类似于以下的命令:

$ python myprogram.py --config configfile1.txt --base 1.0 --LeftDot 1.4

但是对于另一个配置文件,未定义“base”和“LeftDot”,而是使用“LeftNode”和“LowerGate”:

$ python myprogram.py --config configfile3.txt --LeftNode 2.4 --LowerGate 0.6

在查看argparse和optparse文档时,我没有看到能够查找命令行参数的方法,直到运行时我才知道名称(当我打开配置文件时,我很容易看看哪些元素需要施加电压但仅在运行时才有效。)有没有办法告诉argparse将所有不能识别的东西交给我自己的函数?谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

整个配置在运行时完成。这些示例使用字符串常量作为名称,但您不一定要这样做。

首先加载配置,然后当你拥有所有元素时,只需循环遍历这些元素并将它们注册为参数:

parser = argparse.ArgumentParser(....)

for element in configuration_elements:
     parser.add_argument('--' + element, type=float, ...)

然后解析你的命令行。

或者,argparse.ArgumentParser()也是partial parsing mode;只需调用parser.parse_known_args()来解析argparse确实知道的所有内容,它将返回一个名称空间对象(它可以解析的所有选项)以及它不知道如何处理的其余参数:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_known_args(['--foo', '42', '--spam', 'eggs'])
(Namespace(foo='42'), ['--spam', 'eggs'])

在上面的示例中,.parse_known_args()不知道如何处理'--spam''eggs'参数,因此它返回了您自己的代码来处理它们。 --foo 42参数处理。