2017-02-18 10 views
0

У Argparse есть функция, которая называется fromfile-prefix-chars, что, похоже, составляет ровно половину того, что я ищу. Как создать файл для этой функции из текущих аргументов командной строки?Сохранение файла argparse python

У меня сложный скрипт с парсером, который автоматизирует часть сборки кода. Вариант использования - правильная настройка командной строки в первый раз, а затем в основном повторная работа с теми же аргументами.

Использование файла и загрузка из него, похоже, отличный способ реализовать то, что мне нужно. То, что кажется отсутствующим, - это простой способ записать исходную командную строку в файл, чтобы существующий синтаксический анализ файлов работал правильно.

ответ

3

Формат файла документированы достаточно ясно:

Аргументы считанных из файла должен быть по умолчанию один в каждой строке [...]

и пример кода в документации показывает, что они пишут файл с новой строкой между:

>>> 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') 
+0

Я не думаю, что это так просто. См. Http://stackoverflow.com/a/25084994/169296. Ваше решение разделило бы флаг и значение флага на две отдельные строки. –

+0

@BrettStottlemyer: да, и все в порядке. Обратите внимание, что пример кода в документации делает ** именно это **. –

+0

@BrettStottlemyer: обратите внимание, что они являются отдельными аргументами в 'sys.argv'. У вас будет либо '' --option = foo'' (одна строка 'или' '--option'', и' 'foo'' в списке' sys.argv'. –