我正在使用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
参数的情况下运行此示例,它仍将创建2个新文件。我不想在那种情况下创建它们。我可以不传递文件名并手动打开文件吗?
答案 0 :(得分:2)
最简单的方法是只接受文件名作为默认字符串类型,然后再打开文件。
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
用于快速脚本,而不是适用于正确打开和关闭文件的大型项目。