我对python with
运算符
import os
with os.popen('ls') as f:
print f.read()
raise IOError
print f
print f
正如您在上面的代码中看到的,我正在使用with
运算符打开一个文件,我知道该文件将在退出with
块后自动关闭,但如果发生某些错误在内部阻止文件对象f
会发生什么,它会关闭吗?
答案 0 :(得分:4)
是。来自python docs:
上下文管理器是一个对象,它定义在执行with语句时要建立的运行时上下文。上下文管理器处理进入和退出所需运行时上下文以执行代码块。通常使用with语句调用上下文管理器(在with语句一节中描述),但也可以通过直接调用它们的方法来使用。
通常,上下文管理器将实现try..except..finally
模式以方便和重用。
所以,你的问题的答案是肯定的,它处理例外。
答案 1 :(得分:3)
是的,异常将调用上下文管理器的常用清理代码。从PEP 343开始,在描述上下文管理器和with
语句时:
执行 with-block 后,即使块引发异常,也会调用对象的
__exit__()
方法,因此可以运行清理码。
无关:您应该使用subprocess.Popen
(或subprocess.call
或其中一个变体)而不是os.popen
(自Python 2.6以来已弃用)。
答案 2 :(得分:2)
是的它会关闭,您可以在交互式shell中自行测试:
with open('somefile.txt') as f:
a = f.read()
print(f.closed) # Will print False
raise IOError
print(f.closed) # Will print True
答案 3 :(得分:0)
我知道文件将在退出with block
后自动关闭
错误将导致with
块退出。