为何使用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
相关产品推荐
相关产品推荐

