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
.