如何避免return语句中断Python无限循环?
解决循环不中断且传递输出的方法
你遇到的核心问题是return会直接终止函数执行,而yield返回的生成器需要迭代获取结果。下面提供几种实用方案:
方法1:使用回调函数
定义一个处理文本的回调函数,在循环里每次获取到text后调用它,既不会中断循环,又能把输出传到外部处理。
修改后的代码示例:
import time import cv2 import mss import numpy import pytesseract import matplotlib.pyplot as plt from PIL import Image import os pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe' def process_text(text): # 这里写你要对text做的处理,比如拆分单词存集合 text_words = set(text.split()) print("处理后的单词集合:", text_words) def ocr_function(callback): with mss.mss() as mss_instance: mon = mss_instance.monitors[0] with mss.mss() as sct: while True: im = numpy.asarray(sct.grab(mon)) plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)) text = pytesseract.image_to_string(im) time.sleep(5) os.system('cls') print(text) # 调用回调函数传递结果 callback(text) # 启动OCR函数,传入处理回调 ocr_function(process_text)
方法2:使用队列(适合多线程/进程场景)
如果后续需要异步处理结果,用queue.Queue是更规范的方式,它可以安全地在不同线程间传递数据。
示例代码:
import time import cv2 import mss import numpy import pytesseract import matplotlib.pyplot as plt from PIL import Image import os import queue import threading pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe' def process_queue(q): while True: text = q.get() if text is None: # 终止信号 break text_words = set(text.split()) print("处理后的单词集合:", text_words) q.task_done() def ocr_function(q): with mss.mss() as mss_instance: mon = mss_instance.monitors[0] with mss.mss() as sct: while True: im = numpy.asarray(sct.grab(mon)) plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)) text = pytesseract.image_to_string(im) time.sleep(5) os.system('cls') print(text) # 将结果放入队列 q.put(text) # 创建队列并启动处理线程 q = queue.Queue() processing_thread = threading.Thread(target=process_queue, args=(q,)) processing_thread.daemon = True processing_thread.start() # 启动OCR函数 ocr_function(q) # 如果需要终止,执行q.put(None),这里因为是无限循环,所以不需要 processing_thread.join()
方法3:全局变量(不推荐,仅作参考)
虽然不推荐使用全局变量(不利于代码维护和多线程安全),但简单场景下可以临时使用:
import time import cv2 import mss import numpy import pytesseract import matplotlib.pyplot as plt from PIL import Image import os import threading pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe' # 全局变量存储最新文本 latest_text = "" def ocr_function(): global latest_text with mss.mss() as mss_instance: mon = mss_instance.monitors[0] with mss.mss() as sct: while True: im = numpy.asarray(sct.grab(mon)) plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)) text = pytesseract.image_to_string(im) time.sleep(5) os.system('cls') print(text) # 更新全局变量 latest_text = text def process_latest_text(): global latest_text while True: if latest_text: text_words = set(latest_text.split()) print("处理后的单词集合:", text_words) time.sleep(5) # 启动两个线程 ocr_thread = threading.Thread(target=ocr_function) ocr_thread.daemon = True ocr_thread.start() process_thread = threading.Thread(target=process_latest_text) process_thread.daemon = True process_thread.start() # 主线程保持运行 ocr_thread.join()
补充说明
- 你原代码里重复导入了
pytesseract,可以删掉其中一个。 plt.imshow如果仅用于测试,长期运行可能占用资源,不需要的话可以移除。
内容的提问来源于stack exchange,提问作者William_b
相关产品推荐
相关产品推荐

