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

Python2.7下如何自动向Subprocess传入YES?代码报错求助

解决Python 2.7自动传入"YES"时的Broken Pipe错误

我来帮你搞定这个问题!你遇到的"Broken pipe"错误,本质是因为目标命令(cmd)在收到"YES"输入后就关闭了标准输入流,但你启动的YES进程还在一个劲儿往已经失效的管道里写数据,自然就触发了管道断裂的报错。

下面给你两种可行的解决方案,推荐第一种,简单又靠谱:

方案一:直接用communicate()传入输入(首选)

没必要额外启动一个YES进程,Python的subprocess.Popen自带的communicate()方法可以直接帮你把输入传给目标命令,还能自动处理管道的关闭逻辑,完美避免管道错误:

from subprocess import Popen, PIPE

# 把这里替换成你实际要执行的命令
target_cmd = ["your_actual_command"]
foo_proc = Popen(target_cmd, stdin=PIPE, stdout=PIPE)
# 传入"YES"(注意要加换行符,很多命令需要换行来确认输入),同时获取输出
foo_output = foo_proc.communicate(input="YES\n")[0]

# 可选:检查命令执行的返回码,0代表成功
print("命令返回码:", foo_proc.returncode)
print("命令输出内容:", foo_output)

方案二:修复多进程管道的问题(如果必须用YES命令)

如果你因为某种原因一定要用系统的YES命令来提供输入,那得确保在目标命令结束后及时终止YES进程,别让它继续写已经关闭的管道。可以用线程来监控目标进程的状态:

from subprocess import Popen, PIPE
import threading

def stop_yes_when_done(target_proc, yes_proc):
    # 等目标命令执行完
    target_proc.wait()
    # 立刻终止YES进程
    yes_proc.terminate()

# 替换为你的实际命令
target_cmd = ["your_actual_command"]
foo_proc = Popen(target_cmd, stdin=PIPE, stdout=PIPE)
# 注意:Linux/macOS下是小写的"yes",Windows可能需要单独安装GNU工具包才有这个命令
yes_proc = Popen(["yes"], stdout=foo_proc.stdin)

# 启动线程监控,目标进程结束就杀掉YES
monitor_thread = threading.Thread(target=stop_yes_when_done, args=(foo_proc, yes_proc))
monitor_thread.start()

foo_output = foo_proc.communicate()[0]
monitor_thread.join()
yes_proc.wait()

另外提个小细节:你的错误信息里提到了echo,可能你实际执行的cmd和echo有关,记得确认目标命令的输入逻辑是不是真的只需要一次"YES"输入哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:25:51