正在保存 python 个 argparse 文件
Saving python argparse file
Argparse 有一个名为 fromfile-prefix-chars
的功能,它似乎正好完成了我正在寻找的一半。如何从当前命令行参数创建此功能的文件?
我有一个复杂的脚本,其中的解析器正在自动执行部分代码构建。用例是第一次正确设置命令行,然后基本上重新运行相同的参数。
使用文件并从中加载似乎是实现我需要的好方法。似乎缺少的是将初始命令行写入文件的简单方法,以便现有文件解析能够正常工作。
文件格式记录的很清楚:
Arguments read from a file must by default be one per line [...]
并且文档中的代码示例显示他们编写的文件之间有换行符:
>>> 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')
from argparse import ArgumentParser
import json
parser = ArgumentParser()
parser.add_argument('--seed', type=int, default=8)
parser.add_argument('--resume', type=str, default='a/b/c.ckpt')
parser.add_argument('--surgery', type=str, default='190', choices=['190', '417'])
args = parser.parse_args()
with open('commandline_args.txt', 'w') as f:
json.dump(args.__dict__, f, indent=2)
parser = ArgumentParser()
args = parser.parse_args()
with open('commandline_args.txt', 'r') as f:
args.__dict__ = json.load(f)
print(args)
Argparse 有一个名为 fromfile-prefix-chars
的功能,它似乎正好完成了我正在寻找的一半。如何从当前命令行参数创建此功能的文件?
我有一个复杂的脚本,其中的解析器正在自动执行部分代码构建。用例是第一次正确设置命令行,然后基本上重新运行相同的参数。
使用文件并从中加载似乎是实现我需要的好方法。似乎缺少的是将初始命令行写入文件的简单方法,以便现有文件解析能够正常工作。
文件格式记录的很清楚:
Arguments read from a file must by default be one per line [...]
并且文档中的代码示例显示他们编写的文件之间有换行符:
>>> 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')
from argparse import ArgumentParser
import json
parser = ArgumentParser()
parser.add_argument('--seed', type=int, default=8)
parser.add_argument('--resume', type=str, default='a/b/c.ckpt')
parser.add_argument('--surgery', type=str, default='190', choices=['190', '417'])
args = parser.parse_args()
with open('commandline_args.txt', 'w') as f:
json.dump(args.__dict__, f, indent=2)
parser = ArgumentParser()
args = parser.parse_args()
with open('commandline_args.txt', 'r') as f:
args.__dict__ = json.load(f)
print(args)