如何让argparse在位置参数后从带有选项的文件中读取参数

时间:2016-10-15 15:00:14

标签: python argparse

我希望能够将命令行参数放在一个文件中,然后使用argparse将它们传递给python程序,使用选项而不是前缀字符,例如: $ python myprogram.py 1 2 --foo 1 -A somefile.txt --bar 2 这与this question几乎相同,只是我需要在开始时有一些位置参数;当该解决方案调用parse_args时,如果文件中没有位置参数,则会失败。

1 个答案:

答案 0 :(得分:2)

如果somefile.txt包含

one
two
three

然后

$ python myprogram.py 1 2 --foo 1 @somefile.txt --bar 2

使用prefix char实际上与

相同
$ python myprogram.py 1 2 --foo 1 one two three --bar 2

换句话说,在解析开始时,将读取@文件,并将其内容拼接到argv列表中。从那里解析正常发生。

我在另一个SO问题中建议的一件事是在解析之前自己实现拼接。

您所指的答案使用custom动作;在通常Action只将value放入namespace的位置,此操作会读取并解析该文件:

parser.parse_args(f.read().split(), namespace)

变体会解析为新的namespace,并有选择地将值复制到主namespace

显然你的问题是你的解析器有一些必需的参数,如果文件不包含那些,parse_args会引发错误。这并不奇怪。

一种解决方案是为此文件使用不同的parser,一个旨在仅处理文件内容的文件。我只想在全球范围内定义它。

alt_parser.parse_args(f.read().split(), namespace)

换句话说,您不必使用传入的parser作为参数。

对此的一个变体是将文件名放在命名空间中,并在第一次解析后处理它:

args = parser.parse_args()
if args.A:
    argv = open(args.A).read().split()
    args1 = alt_parser.parse_args(argv)

但是您可能会问,我们不能告诉已经解析了哪些参数,并在处理-A时考虑到这一点? parser不是状态机;解析不会改变其任何属性。到目前为止,唯一反映解析的变量是namespace。所有其他解析变量都是调用代码的本地变量。