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
相关产品推荐
相关产品推荐

