Из моего тестирования использование fromfile_prefix_chars
означает, что argparse фактически не передаст аргумент вашей программе.Вместо этого argparse
видит @args.txt
, перехватывает его, читает из него и передает аргументы без @args.txt
в вашу программу.Вероятно, это потому, что большинству людей на самом деле не нужно имя файла, просто нужны аргументы внутри, поэтому argparse
избавляет вас от необходимости создавать другой аргумент для хранения чего-то, что вам не нужно.
К сожалению, всеаргументы хранятся как локальные переменные в argparse.py
, поэтому мы не можем получить к ним доступ.Я полагаю, что вы можете переопределить некоторые функции argparse.Имейте в виду, что это ужасное, отвратительное, хакерское решение, и я чувствую, что разбор sys.argv
на 100% лучше.
from argparse import ArgumentParser
# Most of the following is copied from argparse.py
def customReadArgs(self, arg_strings):
# expand arguments referencing files
new_arg_strings = []
for arg_string in arg_strings:
# for regular arguments, just add them back into the list
if not arg_string or arg_string[0] not in self.fromfile_prefix_chars:
new_arg_strings.append(arg_string)
# replace arguments referencing files with the file content
else:
try:
fn = arg_string[1:]
with open(fn) as args_file:
# What was changed: before was []
arg_strings = [fn]
for arg_line in args_file.read().splitlines():
for arg in self.convert_arg_line_to_args(arg_line):
arg_strings.append(arg)
arg_strings = self._read_args_from_files(arg_strings)
new_arg_strings.extend(arg_strings)
except OSError:
err = _sys.exc_info()[1]
self.error(str(err))
# return the modified argument list
return new_arg_strings
ArgumentParser._read_args_from_files = customReadArgs
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)