Pyautogui/python占用大量内存

0 投票
1 回答
42 浏览
提问于 2025-04-14 16:44

我在写一个Python脚本,目的是让它点击我屏幕上的一个点,使用AI来获取位置。就这么简单。不过,我遇到了一个错误,提示我用完了所有的内存。我发现当我让这个脚本一直运行时,每10秒就会消耗大约1GB的内存。

这是我的代码:

import pyautogui
import cv2
import numpy as np
import time
import gc
import sys
sys.setrecursionlimit(999999999)
num = 1
def take_screenshot():
    screenshot = pyautogui.screenshot()
    screenshot = np.array(screenshot)
    return cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)

def find_and_click_text():
    template_image = "C:/Users/Owner/template2.png"
    screenshot = take_screenshot()
    template = cv2.imread(template_image, cv2.IMREAD_COLOR)
    h, w = template.shape[:-1]

    result = cv2.matchTemplate(screenshot, template, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

    if max_val > 0.8:  # Adjust this threshold based on your needs
        top_left = max_loc
        bottom_right = (top_left[0] + w, top_left[1] + h)
        pyautogui.keyDown('fn')
        pyautogui.keyDown('f12')
        pyautogui.moveTo((top_left[0] + w/2, top_left[1] + h/2))
        pyautogui.mouseDown()
        pyautogui.click()
        skip()
    else:
        global num
        num += 1     
        if num >= 10:
            skip()
            num = 0
        else:
         find_and_click_text()
def skip():
    skipurl = "C:/Users/Owner/skip2.png"
    screenshot2 = take_screenshot()
    template2 = cv2.imread(skipurl, cv2.IMREAD_COLOR)
    h, w = template2.shape[:-1]

    result2 = cv2.matchTemplate(screenshot2, template2, cv2.TM_CCOEFF_NORMED)
    min_val, max_val2, min_loc, max_loc2 = cv2.minMaxLoc(result2)

    if max_val2 > 0.8:
        top_left2 = max_loc2
        bottom_right2 = (top_left2[0] + w, top_left2[1] + h)
        pyautogui.keyDown('fn')
        pyautogui.keyDown('f8')
        pyautogui.moveTo((top_left2[0] + w/2, top_left2[1] + h/2))
        pyautogui.mouseDown()
        pyautogui.click()
        time.sleep(0.5)
        find_and_click_text()
    else:
        global num
        num += 1
        if num >= 10:
            find_and_click_text()
            num = 0
        else:
            skip()

find_and_click_text()

我刚开始学Python(今天才开始),但我在网页开发方面有经验,所以大概明白怎么回事。我在想,这是不是个优化问题,还是我真的很笨呢?

编辑:
我觉得我的解决办法就是每3分15秒停止一次脚本(我计时了,差不多会占用8GB的内存),然后再重新启动它。这样可以释放内存,我就可以继续运行了。不过这并不简单,因为我最开始的目的是让它自动化。我该怎么才能停止脚本,等5到10秒再重新启动呢?也许可以用time.sleep之类的。反正我对Python还很陌生。

1 个回答

0

看起来你没有设置退出条件。你在所有情况下都在使用递归。你的程序什么时候会结束呢?另外,设置到999,999,999这个数字也太大了。

撰写回答