将Python输出导入批处理文件时出现BrokenPipeError错误求助
问题分析
当lock1.bat匹配到正确密码HEL后会立即退出,导致管道被强制关闭,但此时brute_forcer.py仍在持续生成并输出字符组合,尝试向已关闭的管道写入数据,因此触发BrokenPipeError及后续的OSError。
另外,Python默认的输出缓冲区可能会延迟发送数据,导致批处理无法及时接收到正确密码,也会间接延长管道断开前的错误触发窗口。
解决方案
1. 修改Python脚本,捕获异常并优雅退出
修改brute_forcer.py,添加异常捕获逻辑,当检测到管道断开时立即停止运行,同时强制刷新输出缓冲区确保密码实时发送:
import itertools import sys def foo(l): for i in range(1, 101): yield from itertools.product(*([l] * i)) try: chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()[]{},.<>?|;:`~' for x in foo(chars): x_str = ''.join(x) print(x_str) # 强制刷新缓冲区,确保密码立即传递给批处理 sys.stdout.flush() except BrokenPipeError: # 管道关闭时静默退出 sys.exit(0) except OSError as e: if e.errno == 22: sys.exit(0)
2. 优化批处理逻辑(可选)
调整lock1.bat,增加管道输入为空时的退出逻辑,同时用延迟扩展避免特殊字符解析问题:
@echo off setlocal enabledelayedexpansion set "correct_password=HEL" :INPUT set "user_input=" set /p "user_input=" :: 管道无输入时直接退出 if not defined user_input goto :EOF if "!user_input!"=="%correct_password%" ( echo Correct password entered. Access granted. goto :EOF ) else ( echo Incorrect password. Try again. goto INPUT )
3. 执行命令保持不变
继续使用原命令运行:
python "C:\Users\alexe\OneDrive\Documents\test file\brute_forcer.py" | cmd /C "C:\Users\alexe\OneDrive\Documents\test file\lock1.bat"
修改后,当批处理匹配到正确密码退出时,Python脚本会捕获管道断开异常并优雅终止,不再抛出错误。
内容的提问来源于stack exchange,提问作者CrispExplorer
相关产品推荐
相关产品推荐

