2

我有一个 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 将所有它无法识别的东西交给我自己的函数?谢谢您的帮助。

4

1 回答 1

4

整个配置在运行时完成。这些示例使用字符串常量作为名称,但您不受此约束。

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

parser = argparse.ArgumentParser(....)

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

然后解析你的命令行。

或者,argparse.ArgumentParser()也可以作为部分解析模式;只需调用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'and'eggs'参数,所以它返回了那些你自己的代码来处理。该--foo 42论点处理。

于 2013-06-28T21:27:09.820 回答