7

Twitter の Sreaming APIpycurlを使用するPython スクリプトを作成しています。まさにそれを行う短いスニペットを次に示します (テストするには、Twitter のログイン/パスワードを入力するだけです)。

import pycurl

user = 'USER'
password = 'PWD'

def handleData(data):
    print(data)

conn = pycurl.Curl()  
conn.setopt(pycurl.USERPWD, "%s:%s" % (user, password))  
conn.setopt(pycurl.URL, 'https://stream.twitter.com/1/statuses/sample.json')  
conn.setopt(pycurl.WRITEFUNCTION, handleData)
conn.perform()

問題は、スクリプトがストリームを消費するため、conn.perform()返されない (またはごくまれに) ことです。したがって、スクリプトを中断する必要がある場合がありKeyboardInterrupt、メソッドによってキャッチされperform()ます。

ただし、それはうまく処理できず、醜いエラーを出力し、別の例外を発生させます。

^CTraceback (most recent call last):
  File "test.py", line 6, in handleData
    def handleData(data):
KeyboardInterrupt
Traceback (most recent call last):
  File "test.py", line 12, in <module>
    conn.perform()
pycurl.error: (23, 'Failed writing body (0 != 2203)')

cURL FAQによると、進行中の転送を中断するには、コールバック関数の 1 つ (私の場合handleData) が特別な値を返す必要があります。これは素晴らしいことですが、KeyboardInterruptどのコールバック関数にもキャッチされません!

どうすればこれをきれいに行うことができますか?

編集:例外をキャッチできることは知っていますが、pycurl はまだいくつかの面白いことを行います:

私が行った場合:

try:
    conn.perform()
except BaseException as e:
    print('We caught the exception')
    print(type(e))

私は得る:

^CTraceback (most recent call last):
  File "test.py", line 6, in handleData
    def handleData(data):
KeyboardInterrupt
We caught the exception
<class 'pycurl.error'>

これは、内部的にpycurl何らかのキャッチを行い、見苦しいエラー メッセージを出力してから、pycurl.error.

4

2 に答える 2

1

pycurl.error タイプをキャッチすることでこれを行うことができます。元:

try:
    conn.perform()
except pycurl.error, e:
    errorCode, errorText = e.args
    print 'We got an error. Code: %s, Text:%s'%(errorCode, errorText)
于 2012-05-31T21:05:09.907 に答える