Формат файла документированы достаточно ясно:
Аргументы считанных из файла должен быть по умолчанию один в каждой строке [...]
и пример кода в документации показывает, что они пишут файл с новой строкой между:
>>> with open('args.txt', 'w') as fp:
... fp.write('-f\nbar')
Если вы хотите сохранить текущую командную строку, просто напишите sys.argv[1:]
в файл с новой строкой между аргументами:
with open('commandline_args.txt', 'w') as f:
f.write('\n'.join(sys.argv[1:]))
Демо:
>>> from argparse import ArgumentParser
>>> import sys
>>> parser = ArgumentParser(fromfile_prefix_chars='@')
>>> 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.add_argument('bar', nargs='?')
_StoreAction(option_strings=[], dest='bar', nargs='?', const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> sys.argv[1:] = ['--foo', 'spam', 'barbaz']
>>> parser.parse_args()
Namespace(bar='barbaz', foo='spam')
>>> with open('commandline_args.txt', 'w') as f:
... f.write('\n'.join(sys.argv[1:]))
...
17
>>> parser.parse_args(['@commandline_args.txt'])
Namespace(bar='barbaz', foo='spam')
>>> sys.argv[1:] = ['--foo=spam', 'barbaz'] # using alternate syntax
>>> parser.parse_args()
Namespace(bar='barbaz', foo='spam')
>>> with open('commandline_args.txt', 'w') as f:
... f.write('\n'.join(sys.argv[1:]))
...
17
>>> parser.parse_args(['@commandline_args.txt'])
Namespace(bar='barbaz', foo='spam')
Я не думаю, что это так просто. См. Http://stackoverflow.com/a/25084994/169296. Ваше решение разделило бы флаг и значение флага на две отдельные строки. –
@BrettStottlemyer: да, и все в порядке. Обратите внимание, что пример кода в документации делает ** именно это **. –
@BrettStottlemyer: обратите внимание, что они являются отдельными аргументами в 'sys.argv'. У вас будет либо '' --option = foo'' (одна строка 'или' '--option'', и' 'foo'' в списке' sys.argv'. –