我有一个脚本,它接受命令行参数,并且我想要实现两种参数传递方案,分别是:
- 在命令行输入参数。
- 将参数列表存储在文件中,并通过命令行传递该文件的名称。
为此,我将参数fromfile_prefix_chars
传递给ArgumentParser
构造函数。
script.py
from argparse import ArgumentParser
parser = ArgumentParser(fromfile_prefix_chars='@')
parser.add_argument('filename', nargs='?')
parser.add_argument('--foo', nargs='?', default=1)
parser.add_argument('--bar', nargs='?', default=1)
args = parser.parse_args()
print(args)
args.txt
--foo
2
--bar
2
样例用例
$ python script.py --foo 3
Namespace(bar=1, filename=None, foo='3')
$ python script.py @args.txt --foo 3
Namespace(bar='2', filename=None, foo='3')
我本以为args.filename
会保留文件名,但出乎意料的是它的值是None
。我知道可以通过一些处理从sys.argv
获取文件名。有没有更简便(最好基于argparse
方法)的方式来获取参数文件的名称?
args.txt
文件中没有为filename
提供任何值,也没有在命令行中提供。你为什么期望它有一个不同于None
的值呢?fromfile_prefix_chars
做了一件非常具体的事情:当它看到@something
时,用从文件解析出来的参数替换@something
,就这样。它被设计成对参数是不可见的,因为它是在实际命令行解析之前处理的。 - Bakuriufromfile_prefix_chars
参数旨在防止的。 - 101arrowz