0

Python3.3用のPython Imaging Libraryモジュール(Win7、8 GBのRAM)を利用して、画面の小さな(〜40x50)ピクセル領域のスクリーンショットを毎秒1回取得し、それを画像と比較する小さなスクリプトがあります特定のパターンを検出し、見つかった場合は作成した他の 2 つのモジュールを実行する必要があります。スクリプトは最初の 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()

4

1 に答える 1

0

メモリの問題を完全に解決する (または別の条件下で再現する) ための適切な解決策を見つけることができなかったため、アクション間の間隔を 1 秒から 15 秒に増やしただけで、メモリ エラーはまだ発生していません。

于 2013-03-27T14:14:10.730 に答える