我使用的是python 3 argparse。我有多个文件作为argparse.FileType传递,我用它来写一些数据。我想检查一些条件,只有在满足这些条件时才打开这些文件。然而,argparse会立即打开它们,即使我退出时返回错误代码,它们也会被创建。
import argparse
from sys import exit
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--condition', action='store_true')
parser.add_argument('out1', type=argparse.FileType('w'))
parser.add_argument('out2', type=argparse.FileType('w'))
args = parser.parse_args()
if not args.condition:
print('ERROR: please use --condition')
exit(2)
args.out1.write('hello\n')
args.out2.write('world\n')
if __name__ == '__main__':
main()如果我在不传递--condition参数的情况下运行这个示例,它仍然会创建两个新文件。在这种情况下,我不想创建它们。我可以在不传递文件名和手动打开文件的情况下这样做吗?
发布于 2015-04-13 06:05:48
最简单的事情就是接受文件名作为默认的字符串类型,然后打开文件。
http://bugs.python.org/issue13824 (argparse.FileType opens a file and never closes it)实现了一个FileContext类型,它的操作方式类似于FileType,只是它返回了一个context,以后可以将其用作:
with args.input() as f:
f.read()
etc但是,在解析时执行文件名检查,而不实际打开或创建文件,这并不是微不足道的。并且处理不应该关闭的stdin/out增加了复杂性。
在这个bug问题中,argparse开发人员Steven Bethard指出,FileType是为快速脚本而设计的,而不是为那些需要正确打开和关闭文件的大型项目而设计的。
https://stackoverflow.com/questions/29594798
复制相似问题