内存泄漏/Python windows 7屏幕截图

内存泄漏/Python windows 7屏幕截图,python,windows-7,memory-leaks,garbage-collection,screenshot,Python,Windows 7,Memory Leaks,Garbage Collection,Screenshot,我在双监视器系统(Windows7)上尝试了以下Python代码,以反复保存屏幕截图。 它产生了33次14.6MB(总计482MB)的放炮,然后崩溃。通过Process Explorer检查,我可以看到使用的内存量增加到大约500MB 我的问题是如何阻止内存泄漏 import win32gui, win32ui, win32con, win32api import time import os def my_capture(file_name): hwin = win32gui.Ge

我在双监视器系统(Windows7)上尝试了以下Python代码,以反复保存屏幕截图。 它产生了33次14.6MB(总计482MB)的放炮,然后崩溃。通过Process Explorer检查,我可以看到使用的内存量增加到大约500MB

我的问题是如何阻止内存泄漏

import win32gui, win32ui, win32con, win32api
import time
import os


def my_capture(file_name):
    hwin = win32gui.GetDesktopWindow()
    width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
    height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
    left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
    top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
    hwindc = win32gui.GetWindowDC(hwin)
    srcdc = win32ui.CreateDCFromHandle(hwindc)
    memdc = srcdc.CreateCompatibleDC()
    bmp = win32ui.CreateBitmap()    
    bmp.CreateCompatibleBitmap(srcdc, width, height)
    memdc.SelectObject(bmp)
    memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)
    bmp.SaveBitmapFile(memdc, file_name) # 'screenshot.bmp'


def captureAndSave(i):
    if i < 10:
        tmpStr = "00000" + str(i)
    elif i < 100:
        tmpStr = "0000" + str(i)
    elif i < 1000:
        tmpStr = "000" + str(i)
    elif i < 10000:
        tmpStr = "00" + str(i)
    elif i < 100000:
        tmpStr = "0" + str(i)
    else:
        tmpStr = str(i)

    my_capture(tmpStr + '.bmp')


def myMainLoop():
    i = 0
    while 1:
        i = i + 1
        captureAndSave(i)
        time.sleep(0.2)

#-----------------------------------------------------------------------------

if __name__ == '__main__':
    try:
        myMainLoop()        # capure all monitor windows
    except KeyboardInterrupt:
        pass 
导入win32gui、win32ui、win32con、win32api
导入时间
导入操作系统
def my_捕获(文件名):
hwin=win32gui.GetDesktopWindow()
宽度=win32api.GetSystemMetrics(win32con.SM\u CXVIRTUALSCREEN)
高度=win32api.GetSystemMetrics(win32con.SM\u CYVIRTUALSCREEN)
左=win32api.GetSystemMetrics(win32con.SM\u XVIRTUALSCREEN)
top=win32api.GetSystemMetrics(win32con.SM\u虚拟屏幕)
hwindc=win32gui.GetWindowDC(hwin)
srcdc=win32ui.CreateDCFromHandle(hwindc)
memdc=srcdc.CreateCompatibleDC()
bmp=win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc、宽度、高度)
memdc.SelectObject(bmp)
memdc.BitBlt((0,0),(宽度,高度),srcdc,(左,上),win32con.SRCCOPY)
bmp.SaveBitmapFile(memdc,文件名)#“screenshot.bmp”
def captureAndSave(i):
如果i<10:
tmpStr=“00000”+str(一)
如果i<100:
tmpStr=“0000”+str(一)
如果i<1000:
tmpStr=“000”+str(一)
如果i<10000:
tmpStr=“00”+str(一)
elif i<100000:
tmpStr=“0”+str(一)
其他:
tmpStr=str(i)
my_捕获(tmpStr+'.bmp')
def myMainLoop():
i=0
而1:
i=i+1
捕获和保存(i)
睡眠时间(0.2)
#-----------------------------------------------------------------------------
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
myMainLoop()#保存所有监视器窗口
除键盘中断外:
通过


我从以下位置获得了基本代码:

您需要清理位图和DC,在保存位图后添加类似的内容

win32gui.DeleteObject(bmp.GetHandle())
memdc.DeleteDC()
srcdc.DeleteDC()
win32gui.ReleaseDC(hwin, hwindc) 

谢谢你的回答。添加清理代码后,它工作得非常完美。