You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:22:36