Python:为什么打开文件可以与 subprocess.Popen 一起使用?

问题描述 投票:0回答:2

据我所知,如果我们使用“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 已关闭。 谁能解释一下为什么?

python python-3.x file-io subprocess with-statement
2个回答
0
投票

感谢@Tranbi,检查了代码,这是正确的答案。


-1
投票

对于子流程

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
© www.soinside.com 2019 - 2024. All rights reserved.