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

Python读取父进程输出并保存到日志文件的实现问题咨询

问题修复方案:父进程输出作为子进程输入并保存日志

原有代码核心错误点

  • 缺少必要的模块导入,parent.py未导入subprocess、sys模块,直接运行会报错
  • 不可直接将子进程stdin绑定为父进程的sys.stdout,两个进程的文件描述符相互独立,该赋值逻辑无效
  • Python标准输出默认开启缓冲区,未手动刷新的情况下打印内容不会即时发送,会导致子进程input()调用长期阻塞
  • 日志写入逻辑未同步换行符,也未做刷新处理,会出现日志内容缺失、格式混乱的问题

修复后可运行代码

parent.py

import subprocess
import sys
import os

def writer():
    i = 10
    while i:
        print(i, flush=True)  # 开启即时刷新,避免内容滞留在缓冲区
        i -= 1

# 创建匿名管道,r为读端,w为写端
r, w = os.pipe()
# 替换父进程标准输出为管道写端,所有print内容都会写入管道
sys.stdout = os.fdopen(w, 'w', buffering=1)  # 行缓冲模式,打印换行自动刷新

print('Start of parent process \n')
# 子进程stdin绑定管道读端,直接读取父进程输出内容
process = subprocess.Popen(['python3', 'reader.py'], stdin=r)
print('Start of writer')
writer()

# 父进程输出完成后关闭管道写端,通知子进程输入结束
sys.stdout.close()
# 等待子进程执行完成
process.wait()

reader.py

def reader():
    count = 10
    # 用with上下文自动管理文件句柄,无需手动关闭
    with open('log', 'w', encoding='utf-8') as log:
        while count:
            print(f'count = {count}')
            i = input()
            print(i)
            # 写入日志时补充换行符,和原始输出格式保持一致
            log.write(f'{i}\n')
            count -= 1

print('Second process started')
reader()
print('Second process finish')

实现说明

该方案通过系统匿名管道实现父子进程的数据传输,完全符合「不通过其他通道发送、父进程输出直接作为子进程输入」的要求。你现有使用echo/print打印的脚本,只需将其标准输出重定向到管道写端,所有打印内容都会被子进程捕获并写入日志文件。

内容的提问来源于stack exchange,提问作者Ostap Iudin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 10:42:00