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

为何使用subprocess.run调用ssh会关闭父进程的stdin管道?

问题分析与解决

问题原因

你的foo.py里,通过subprocess.run启动的ssh进程默认继承了父进程(foo.py)的标准输入(stdin)。当ssh localhost sleep 10执行完毕退出时,它会关闭自己持有的stdin文件描述符——而这个描述符和foo.py的stdin是同一个,这就导致foo.py的stdin被意外关闭。后续foo.py执行到x = input("i2")时,尝试从已经关闭的stdin读取,自然触发EOFError。

解决方案

修改foo.py中subprocess.run的调用,明确禁止ssh进程继承父进程的stdin,将其重定向到DEVNULL:

修改后的foo.py:

import time
import subprocess
from multiprocessing import Process

def foo():
    # 添加stdin=subprocess.DEVNULL,避免ssh占用foo.py的stdin
    subprocess.run(["ssh", "localhost", "sleep", "10"], stdin=subprocess.DEVNULL) 

p = Process(target=foo)
p.start()
x = input("i1")
x = input("i2")

这样ssh进程不会再使用foo.py的stdin,当它退出时也不会影响foo.py的输入流,bar.py通过管道发送的输入就能被foo.py的input正常读取,不会再出现EOF错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:52:33