読者です 読者をやめる 読者になる 読者になる

栗’s diary

Python勉強中。トレードに役立つようなTwitter bot開発中。

ツイッターbot作成の道(その5):Libraries

前回、アプリ内にデータを保存するためにjsonファイルの使用を試みた栗氏。GAEの仕様として書き込み不可である事を後で知ってショックを受けたわけですが、仕方なくデータベースの使用を考えます。

詳細はまた別の機会に書きますが、とりあえずGoogleスプレッドシートを使ってみる事にしました。どうにかこうにか通常のプログラミングではデータのやり取りに成功。次はローカルでのテスト。その時、また奴が現れたのです。

「ImportError: cannot import name RAND_egd」

ツイッターbot作成の道(その1) - 栗’s diaryで「Tweepy(失敗)」という所でも出てきた難攻不落の敵。(ググるコメントアウトなどで上手くいくよという記述が見られるが、なぜかそれが通用しない。コメントアウトしてコードとしてはないはずなのに、エラーと注意される。わけわからん。)

どうやらtweepyもgspread(Google スプレッドシートを扱うのに便利なモジュール)も結局、requestsモジュールを使う際にエラーになってる模様。

前回は避けて通ったが、今はこいつをやっつけないと将来使うかもしれないいくつかの便利なモジュールも使えないだろう事に気付いてしまっていた。

Using Built-in Libraries in Python 2.7  |  Python  |  Google Cloud Platform

You can add a third-party library to your app in one of two ways: requesting the library or installing the library.

GAEで標準では使えないモジュールを使えるようにする方法は二つあって、一つはapp.yaml内にlibraryとして登録する。ただし、これはGoogleが許可したものであってかなり限定されている。もう一つは、アプリフォルダにそのモジュールを機能させるために必要なファイルも一緒に入れてアップロードするという方法。この場合もCで拡張してるものは無理。

 The library must be implemented as pure Python code with no C extensions.

 この条件によれば、requestsはアップロードする形で導入できるはず。なのに出来ないのは何か解決策があるはず...。

 結果から述べると「ImportError: cannot import name RAND_egd」はやっつけられませんでした。つまりローカルではエラー。ただし、無視してDeploy(アップロード)しアプリとしては上手くいく方法を発見できました。requestsに特化した解決方法ですが。

stackoverflow.com

you must replace the following line in your requests/models.py file :

「ChunkedEncodingError」ってのはDeployしたアプリを実行した場合に発生するエラーでそれでググってみました。かなり強引な解決方法だな...。Python2系に限定しているからこう言うエラーが発生するんですかね、知らんけど。

とりあえず、GAE上でGoogleスプレッドシートとのデータのやり取りに成功しました。ローカル環境でテスト出来ないのが不便ですが。

「ImportError: cannot import name RAND_egd」の抜本的対策をご存知の方はご教授を(>人<;)