subprocess与子进程交互

1.readline存在阻塞机制,启动线程监控

2.检测到exit、quit,终止process子进程-》终止进程完成会关闭stdout、stderr-》关闭后pipe.readline返回''-》子线程跳出循环结束

python 复制代码
import subprocess
import threading
import time


def read_output(pipe):
    try:
        for line in iter(pipe.readline, ''):
            if not line:
                break
            print(line, end='')
    finally:
        pipe.close()

process = subprocess.Popen(
    ["python","-i"],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True,
    bufsize=1
)

# 启动线程
threads = [
    threading.Thread(target=read_output, args=(process.stdout,)),
    threading.Thread(target=read_output, args=(process.stderr,))
]

for t in threads:
    t.start()

try:
    while True:
        cmd = input(">>> ")
        if cmd.strip().lower() in ("exit", "quit"):
            break
        process.stdin.write(cmd + "\n")
        process.stdin.flush()
        time.sleep(0.001)

except KeyboardInterrupt:
    print("Interrupted")

finally:
    process.terminate()

    try:
        process.wait(timeout=5)
    except subprocess.TimeoutExpired:
        process.kill()

    # 关闭 stdin
    if process.stdin:
        process.stdin.close()

    # 等线程退出
    for t in threads:
        t.join(timeout=2)

    print("Process closed")
相关推荐
qfljg2 小时前
OpenRewrite 实战指南
java
Sylvia33.2 小时前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
2601_962071577 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491118 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水8 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero9 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-10 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
zww894911110 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设11 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳12 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法