为何with open打开的文件可配合subprocess.Popen正常工作?
问题解答
这背后的核心是操作系统级别的文件描述符复制机制,具体原因可以拆解为以下几点:
- 当你在
with块里调用subprocess.Popen并传入stdout=fd、stderr=fd时,操作系统会为新建的子进程(即ping命令)复制一份当前文件句柄对应的文件描述符。 - Python代码里的
fd.close()(包括with上下文自动执行的关闭操作),仅关闭了父进程(你的Python脚本)中对该文件句柄的引用,完全不会影响子进程里已经完成复制的那份文件描述符。 - 子进程(ping)在运行的10秒内,会持续使用自身持有的文件描述符写入输出内容,直到它运行结束后主动关闭这个描述符,操作系统才会完成文件的最终写入(若存在缓冲区数据会自动刷新)。
- 你看到的
print("此时文件句柄已关闭"),仅代表父进程的文件句柄已关闭,子进程的文件描述符仍在正常工作,因此ping的输出能成功写入hello.txt。
内容的提问来源于stack exchange,提问作者Neo Qiao
相关产品推荐
相关产品推荐

