Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python脚本可以正常运行一段时间,然后返回MemoryError(Python 3.3)_Python_Python 3.x_Tkinter_Python Imaging Library_Pywin32 - Fatal编程技术网

Python脚本可以正常运行一段时间,然后返回MemoryError(Python 3.3)

Python脚本可以正常运行一段时间,然后返回MemoryError(Python 3.3),python,python-3.x,tkinter,python-imaging-library,pywin32,Python,Python 3.x,Tkinter,Python Imaging Library,Pywin32,我有一个小脚本,它利用Python3.3的Python Imaging Library模块(在Win7上,8 gb的RAM)每秒拍摄一次屏幕上一个小(~40x50)像素区域的屏幕截图,并将其与我已经检测到的特定模式的图像进行比较,如果发现,则执行我创建的另外两个模块。在最初的30分钟左右,脚本似乎工作正常,但随后脚本崩溃,我得到以下错误: 回溯(最近一次呼叫最后一次): 文件“”,第420行,在run_nodebug中 文件“C:\Users\Nate Simon\Dropbox\CaptchL

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

回溯(最近一次呼叫最后一次):
文件“”,第420行,在run_nodebug中
文件“C:\Users\Nate Simon\Dropbox\CaptchLibrary\DetectRun.py”,第68行,在:
im2=ImageGrab.grab((左、上、右、下))
文件“C:\Python33\lib\site packages\PIL\ImageGrab.py”,第47行,在grab:
大小,数据=抓取器()
存储器错误

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

以下是令人不快的代码:

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)

在另一节中,在使用
c添加新数据之前,将清除剪贴板。剪贴板\u clear()

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

您是否尝试用您给出的代码片段重现该问题,以确保它是导致该问题的原因?让它疯狂地截图,直到崩溃。这是一种对图像设置阈值的低效方法。尝试使用
Image.point
方法而不是嵌套循环,看看内存问题是否消失。我再次运行了它,没有延迟并隔离部分代码,但我无法复制错误。我想我会努力隔离不同的部分,直到找到问题。@wim谢谢你的提示,我会尽快实现的。你在操作图像对象后会破坏它吗?还是你只是在创造越来越多的图像?如果你每秒创建一个新映像,过一段时间就会占用大量内存。如果你正在使用tkinter,千万不要调用
sleep
。尽管你已经隐藏了窗口,但这并不是Tkinter设计使用的方式。现在允许应用程序为事件提供服务,您可能正在阻止一些垃圾收集。如果您想每秒做一次,只需在之后使用
    c = Tk()
    c.withdraw()
    result = c.clipboard_get()
    c.destroy()