2014-09-30 56 views
0

我想用python腳本編輯大量圖像。圖像數量變化很大,只有少量的圖像(10-20)時,一切正常,我沒有得到任何錯誤。當圖像數量增加(100-200)時,會發生奇怪的事情。當我直接運行腳本時,我從來沒有得到任何錯誤,一切都運行良好。當我從另一個腳本調用腳本時,會發生MemoryError。
一般過程:
- 文件名檢查
- 匹配的.txt文件讀取和變量設置
- 圖像
上繪製矩形 - 保存圖像圖像處理內存錯誤

腳本:

import Image,ImageDraw, os, time, sys 
def main() : 
    print('*****************************************') 
    print('  Draw_Rectangle v1.2     ') 
    print('*****************************************') 
    print(' ') 
    start= time.time() 
    print(' ') 
    print('Starting drawing rectangles...') 
    path = os.path.join("C:\Program Files\test\images") 
    fileList = os.listdir(path) 
    total = len(fileList) 
    count = 0 
    for fileName in fileList : 
     if fileName.endswith("FULL.png") : 
      ins = open(os.path.join(path,fileName[:-9]+".txt"), "r") 
      for line in ins : 
       if line[0] == "x" : 
        x = line[2:] 
       if line[0] == "y" : 
        y = line[2:] 
       if line[0] == "w" : 
        w = line[2:] 
       if line[0] == "h" : 
        h = line[2:] 
        break 
      ins.close() 
      im = Image.open(os.path.join(path,fileName)) 
      draw=ImageDraw.Draw(im) 
      draw.rectangle([int(x),int(y),int(x) + int(w),int (y) + int(h)],outline="#0000FF") 
      draw.rectangle([int(x)-1,int(y)-1,int(x) + int(w)-1,int (y) + int(h)-1],outline="#0000FF") 
      draw.rectangle([int(x)+1,int(y)+1,int(x) + int(w)+1,int (y) + int(h)+1],outline="#0000FF") 
      im.save(os.path.join(path,fileName),"PNG") 
      count+=4 
      percentage = (count * 100)/total 
      print 'Progress : [%d%%]\r'%percentage, 
    duration= time.time()-start 
    print('Progress : [100%]') 
    print(' ') 
    print('Drawing rectangles completed') 
    print(' ') 
    print('Duration : ' + str(duration) + ' seconds') 
    return 0 

if __name__ == "__main__": 
    main() 

線代碼從另一個腳本調用腳本:

os.system(r'python.exe -u "C:\Scripts\Draw_Rectv2.py"') 

所以總結: 我試圖在圖像上繪製矩形,當我正常運行腳本時,我沒有得到任何錯誤。當我從其他腳本調用它,我得到

ExceptionInOtherThread(Exception in other Thread - MemoryError) 

親切的問候, 價格

+0

您可以執行'execfile(r「c:\ Scripts \ Draw_Rectv2.py」)''而不是使用'os.system'。我不知道它是否會修復它,但我認爲值得嘗試 – Elisha 2014-09-30 12:09:44

+1

使用'system'來獲得一個Python腳本來執行另一個腳本是非常不尋常的。你嘗試過'進口'而不是? – Kevin 2014-09-30 12:22:08

+0

@Kevin:我使用'system'是因爲我在一個不能使用導入的受限制環境中工作。 – 2014-10-06 06:42:11

回答

0

奇。 PIL docs沒有提到你需要調用圖像的任何close/destroy/dispose方法。我也沒有看到你的代碼中有任何其他內存泄漏。最後一個可能的問題是其中一個圖像非常大或包含Zip Bomb

要確定問題是否出現在其中一個圖像中,請在處理它們時記錄圖像名稱(使用完整路徑)。這樣,您可以查看代碼嘗試處理的最後一幅圖像。