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

如何避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:02:24