据我所知,如果我们使用“with open”打开一个文件,当代码超出with上下文管理器时,该文件将被关闭。
with open(somefile) as fd:
# do some thing
# fd.close() # automatically
print("Before We get here, the fd is closed")
所以我不明白为什么下面的代码有效:
with open("hello.txt", mode="w") as fd:
p = subprocess.Popen("ping 127.0.0.1 -n 10", stdout=fd, stderr=fd)
# fd.close() # automatically
print("Before We get here, the fd is closed")
我在子进程调用后立即关闭了文件,命令 ping 将运行 10 秒。为什么ping的输出仍然可以成功写入hello.txt? 在我看来,Popen 应该引发异常,因为 fd 已关闭。 谁能解释一下为什么?
感谢@Tranbi,检查了代码,这是正确的答案。
对于子流程
subprocess.Popen()
用于启动一个新进程并与其交互。
该函数返回一个 subprocess.Popen
对象,它代表新进程。
文档在这里: https://docs.python.org/3/library/subprocess.html
用于文件打开/关闭。 您可以使用以下命令检查代码每一步的状态:
import subprocess
with open("hello.txt", mode="w") as fd:
p = subprocess.Popen("ping 127.0.0.1 -n 10", stdout=fd, stderr=fd)
print('file closed:', fd.closed)
# fd.close() # automatically
print('file closed:', fd.closed)
print("Before We get here, the fd is closed")
给出了这个:
file closed: False
file closed: True
Before We get here, the fd is closed