0

我有一个小脚本,它利用 Python3.3 的 Python Imaging Library 模块(在 Win7 上,8 gb 的 RAM)每秒一次截取屏幕的一个小(~40x50)像素区域并将其与图像进行比较我已经必须检测一个特定的模式并执行我创建的另外两个模块,如果它被发现的话。该脚本似乎在前 30 分钟左右完美运行,但随后脚本崩溃,我收到以下错误:

Traceback (most recent call last):
File "<string>", line 420, in run_nodebug
File "C:\Users\Nate Simon\Dropbox\CaptchaLibrary\detectNRun.py", line 68, in <module>:
im2 = ImageGrab.grab((left,upper,right,lower))
File "C:\Python33\lib\site-packages\PIL\ImageGrab.py", line 47, in grab:
size, data = grabber()
MemoryError

我已经调整了屏幕截图之间的时间,它所做的只是程序崩溃时的延迟。

这似乎是有问题的代码:

im2 = ImageGrab.grab((left,upper,right,lower)) # Take a screenshot at given coordinates

for x in range(im2.size[0]): # This section just changes to image to black/white for better comparing but might be relevant.
    for y in range(im2.size[1]):
        pixel = im2.getpixel((x,y))
        if pixel[0] < 40 or pixel[1] < 40 or pixel[2] < 40:
            color = (0, 0, 0)
        else:
            color = (255, 255, 255)
        im2.putpixel((x,y), color)

此脚本中没有添加任何列表、字典或数据库,每次运行时,旧屏幕截图都会在内存中被覆盖(它永远不会保存到磁盘)。

也可能相关:来自我sleep()用于延迟和time()跟踪系统时间的时间模块。我还使用 win32api 进行鼠标/键盘输入,并使用 tkinter 在以下几行中读取剪贴板:

    c = Tk()
    c.withdraw()
    result = c.clipboard_get()
    c.destroy()

在另一部分中,在添加新数据之前清除剪贴板c.clipboard_clear()

4

1 回答 1

0

我无法找到完全解决内存问题的适当解决方案(甚至在不同条件下复制它),所以我只是将操作之间的间隔从 1 秒增加到 15 秒,我还没有再次遇到内存错误。

于 2013-03-27T14:14:10.730 回答