【问题标题】:How does subprocess handle file pointer?子进程如何处理文件指针?
【发布时间】:2020-01-15 03:19:25
【问题描述】:

假设 Python 中的代码框架如下所示。此代码正在调用另一个可执行的 bash 脚本以在 Ubuntu 18.04 上并行运行。

#!/usr/bin/env python3
#encoding:utf-8

import subprocess 
with open(file='subprocess_output.log', mode='a') as file_pointer:
    subprocess.Popen(args=['./subprocess.bash'], stdout=file_pointer, stderr=file_pointer)

#Next section

它正在工作。但我很好奇,with 语句是否正在关闭文件指针并在主代码进入下一节时立即释放资源。这不正是with 语句应该做的吗?获取和释放资源安全?但是,如果日志文件的句柄在调用后立即释放,那么当主脚本继续前进时,子进程缓冲区如何稍后写入日志?

对于深入了解操作系统如何在较低级别处理文件的任何人来说,答案可能是显而易见的。因此,任何指向在线资源(双关语)的指针都会很棒。

【问题讨论】:

    标签: python subprocess io-redirection filehandle


    【解决方案1】:

    每个进程都有自己的一组打开文件。子进程是使用父进程打开文件句柄(Unix 中的“描述符”,子集由FD_CLOEXEC flag 管理)的(子集)的副本 创建的。 with 会立即关闭父级的句柄,但这根本不会影响子级。

    有时是否保留任何个副本很重要:例如,当写入端的每个副本都已关闭时,从管道读取会产生EOF。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-08
      • 2019-10-18
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多