黙々とC#

"In a mad world of VBA, only the mad are sane" 『VBAという名の狂った世界で狂っているというのなら私の気は確かだ』

GAE/Py で "ImportError: No module named _winreg"が発生する 原因と解決策

f:id:d_ymkw:20170530004131j:plain

Google App Engine / Python アプリケーションを、Windows開発機でデバッグしようとすると “ImportError: No module named _winreg"が発生することがある。

原因と解決策がわかったのでメモしておく。

当該エラーが発生する原因は、GAEの開発用実行環境で、_winregの読み込みが許可されていないため。SDKにデフォルトで用意されているライブラリを使う分には問題ないが、特定のサードパティライブラリ(モジュール)をimportした際に起こることがある。

※ GAEの本番環境がUNIX/Linux環境のため、開発用実行環境(サンドボックス環境)もデフォルトでhUNIX/Linuxに合わせて設定されている。(Windows環境での実行は考慮されていないため、Windows環境での動作を想定したライブラリはデフォルトでインポートが許可されていない。)

解決方法としては、GAEのインストールフォルダ下にあるsandbox.pyの設定を書き換える(_winregのインポートを許可する)。

状況

  • Windows 10で開発
  • Google App Engine / Pythonアプリケーションを開発環境(dev_appserver.py)で実行
  • ソースコード中で、"requests"ライブラリを使用

requestsライブラリの使用方法

デフォルトでは、GAE / Pythonはサードパティのライブラリはインポートできない。

下記手順で利用可能にする。

  1. サードパティライブラリを配置するためのフォルダ(eg. lib/)をつくる。
  2. pip -tオプションで、libフォルダにサードパティライブラリをインストール
    pip install -t lib/ <library_name>
  3. app.yamlファイルと同階層に appengine_config.py を作成
  4. appengine_config.py にライブラリを読み込むフォルダを指定するためのコードを追加
    from google.appengine.ext import vendor
    vendor.add(‘lib’)

参考:Using third-party libraries  |  App Engine standard environment for Python  |  Google Cloud Platform

発生したエラー

File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py”, line 964, in load_module

raise ImportError(‘No module named %s’ % fullname)

ImportError: No module named _winreg

Pythonがデフォルトで備える_winregライブラリ(Windowsのレジストリ操作用ライブラリ)がインポートできないとのエラーが出る

原因

requestsライブラリが、内部で_winregをインポートしている。

が、開発環境(sandbox環境)ではデフォルトでは_winregはインポートが許可されていない。

解決策

サンドボックス環境で、_winregのインポートを許可する。

<sdk_root>\google\appengine\tools\devappserver2\python\sandbox.py の

_WHITE_LIST_C_MODULES = [xxx]

に、

**'_winreg',**

を追加。

sandbox.pyの上記項目で、開発用サーバ(dev_appserver.py)がインポート可能なライブラリを指定(追加)することが出来る。