2013-03-13 70 views
0

我有一個小腳本,利用Python3.3的Python圖像庫模塊(在Win7上,8 GB的RAM)截取一個小的( 〜40x50)像素面積每秒一次,並將其與我已經必須檢測特定圖案的圖像進行比較,並執行我創建的其他兩個模塊(如果找到它)。該腳本似乎完美前30分鐘左右的工作,但隨後的腳本崩潰,我得到以下錯誤:Python腳本運行良好一段時間然後返回MemoryError(python 3.3)

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()

+0

您是否試圖用您提供的一段代碼重現問題,以確保它是由什麼引起的?只要讓它像瘋了一樣截圖,直到它崩潰。 – wldsvc 2013-03-13 02:15:48

+0

這是一種瘋狂的低效方式來限制圖像。嘗試使用'Image.point'方法而不是嵌套循環,並查看你的內存問題是否消失。 – wim 2013-03-13 02:29:34

+0

我跑了它沒有延遲和孤立代碼的一部分,但我無法複製錯誤。我想我會努力隔離不同的部分,直到找到問題。 @wim非常感謝您的提示,我會盡快實施。 – 2013-03-13 02:52:38

回答

0

我無法找到完全解決內存問題的適當解決方案(甚至在不同條件下複製它),所以我只是將操作之間的間隔從1秒增加到15秒,並且我還沒有再次獲得內存錯誤。