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