【发布时间】:2013-03-13 02:08:30
【问题描述】:
我有一个小脚本,它利用 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()
【问题讨论】:
-
您是否尝试仅使用您提供的一段代码来重现该问题,以确保它是导致问题的原因?让它疯狂地截图直到它崩溃。
-
这是一种非常低效的图像阈值方法。尝试使用
Image.point方法而不是那个嵌套循环,看看你的内存问题是否消失了。 -
我再次运行它没有延迟并隔离部分代码,但我无法复制错误。我想我会努力隔离不同的部分,直到找到问题所在。 @wim 感谢您的提示,我会尽快实施。
-
您是否在操作后破坏了图像对象?还是您只是在创建越来越多的图像?如果您每秒创建一个新图像,那么一段时间后会占用大量内存。
-
如果你使用 tkinter,你不应该打电话给
sleep。即使您已经隐藏了窗口,但这确实不是 Tkinter 设计的使用方式。现在允许应用程序服务事件,您可能会阻止一些垃圾收集。如果您想每秒执行一次,只需使用after。
标签: python python-3.x tkinter python-imaging-library pywin32