2016-07-30 5 views
-2

私はpythonスクリプトでcaptchaファイルの認識を自動化しようとしています。 しかし、努力の数日後、私の機能は望ましい結果から遠くにあるようです。AttributeError:Pythonでダウンロードした画像をバッファリング中に__exit__ 2.7

さらに、私が得たトレースバックは、私がさらに調査するのに役立つ情報ではありません。ここで

は私の関数である。ここでは

def getmsg(): 
    solved = '' 
    probe_request = [] 
    try: 
     probe_request = api.messages.get(offset = 0, count = 2) 
    except apierror, e: 
     if e.code is 14: 
      key = e.captcha_sid 
      imagefile = cStringIO.StringIO(urllib.urlopen(e.captcha_img).read()) 
      img = Image.open(imagefile) 
      imagebuf = img.load() 
      with imagebuf as captcha_file: 
       captcha = cptapi.solve(captcha_file) 
    finally: 
     while solved is None: 
      solved = captcha.try_get_result() 
      tm.sleep(1.500) 
     print probe_request 

はトレースバックです:

Traceback (most recent call last): 
    File "myscript.py", line 158, in <module> 
    getmsg() 
    File "myscript.py", line 147, in getmsg 
    with imagebuf as captcha_file: 
AttributeError: __exit__ 

誰かが私が間違ってやっている正確に何を明確にしてくださいことはできますか?

また、私は、バッファリングせずに画像処理で成功しませんでした:につながる

key = e.captcha_sid 
response = requests.get(e.captcha_img) 
img = Image.open(StringIO.StringIO(response.content)) 
with img as captcha_file: 
    captcha = cptapi.solve(captcha_file) 

captcha = cptapi.solve(captcha_file) 
    File "/usr/local/lib/python2.7/dist-packages/twocaptchaapi/__init__.py", line 62, in proxy 
    return func(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/twocaptchaapi/__init__.py", line 75, in proxy 
    return func(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/twocaptchaapi/__init__.py", line 147, in solve 
    raw_data = file.read() 
    File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 632, in __getattr__ 
    raise AttributeError(name) 
AttributeError: read 

答えて

0

imagebufcontext managerではありません。最初にcontextmanager.__exit__ methodを格納してコンテキストマネージャーをテストするwithステートメントでは使用できません。それを閉じる必要はありません。

cptapi.solveには、ファイルのようなオブジェクトが必要です。 solve() docstringから:

Queues a captcha for solving. file may either be a path or a file object.

ここImageオブジェクトを渡しにはポイントがありませんが、ちょうどその代わりStringIOインスタンスに渡します。

imagefile = cStringIO.StringIO(urllib.urlopen(e.captcha_img).read()) 
captcha = cptapi.solve(imagefile) 

を繰り返しますが、ここではオブジェクトをその近くに使用する必要はありませんwithを使用する必要はありません。

+0

ありがとうございます。問題は解決しました。 – unexposed

関連する問題