Python 2 ライブラリの使用

サードパーティ ライブラリが C 拡張機能を使用していない純粋な Python コードであれば、そのライブラリをアプリケーション ディレクトリにコピーして使用できます。サードパーティ ライブラリがランタイムにバンドルされている組み込みライブラリである場合、アプリにコピーせずにライブラリを使用できます。

サードパーティ ライブラリは、C 拡張機能を使用しない純粋な Python コードとして実装する必要があります。アプリケーション ディレクトリにコピーされたサードパーティ ライブラリは、ファイル割り当てに加算されます。ライブラリがアプリケーション コードと一緒に App Engine にアップロードされるためです。

サードパーティ ライブラリをコピーする

ランタイムにバンドルされている組み込みライブラリのリストに含まれていないサードパーティ ライブラリを使用する手順は次のとおりです。

  1. サードパーティ ライブラリの保存先ディレクトリ(例: lib/)を作成します。

    mkdir lib
    
  2. pip(バージョン 6 以降)で -t <directory> フラグを指定して、前のステップで作成したフォルダにライブラリをコピーします。次に例を示します。

    pip install -t lib/ <library_name>
    

    macOS で Homebrew Python を使用している場合

  3. app.yaml ファイルと同じフォルダに、appengine_config.py という名前のファイルを作成します。

  4. appengine_config.py ファイルを編集し、vendor.add() メソッドにライブラリ ディレクトリを指定します。

    # appengine_config.py
    from google.appengine.ext import vendor
    
    # Add any libraries install in the "lib" folder.
    vendor.add('lib')
    

    この例の appengine_config.py ファイルでは、現在の作業ディレクトリが lib フォルダの置かれているディレクトリであるものと想定しています。単体テストなどの一部のケースでは、現在の作業ディレクトリはこれとは異なる場合があります。エラーが発生しないようにするために、lib フォルダのフルパスを次のようにして明示的に指定できます。

    vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
    

コピーしたライブラリで pip 要件ファイルを使用する

pip では、インストールが必要なライブラリのリストを、要件ファイルというファイルから読み取ることができます。要件ファイルを使用することにより、アプリの新しい開発環境のセットアップや、新しいバージョンのライブラリへのアップグレードが容易になります。

要件ファイルは、ライブラリごとに 1 行ずつ、パッケージ名とバージョンがリストされているテキスト ファイルです。

Flask==0.10
Markdown==2.5.2
google-api-python-client

要件ファイルからライブラリをインストールするには、-t lib フラグと、-r フラグを使用します。

pip install -t lib -r requirements.txt

ランタイムにバンドルされている組み込みのサードパーティ ライブラリを使用する

サードパーティ ライブラリが App Engine Python ランタイムにバンドルした組み込みライブラリのリストにある場合は、たとえば以下のように app.yaml 内の libraries ディレクティブにそのライブラリを指定するだけで使用できます。

libraries:
- name: PIL
  version: "1.1.7"
- name: webob
  version: "1.1.1"

App Engine はデプロイ時に、リクエストされているライブラリを自動的に提供します。

バンドルされた組み込みライブラリをローカル開発サーバーで使用する

ランタイムによって提供される組み込みライブラリの多くは、自動的にローカル開発サーバーで利用可能になります。一部のライブラリでは、ローカルにインストールするために gcloud components install app-engine-python-extras を実行する必要があります。ローカル開発用サーバーが、このコンポーネントが必要であることを検出すると、インストールを求めるメッセージを表示します。次の組み込みライブラリは、ローカル開発用サーバーで使用する前にローカルにインストールする必要があります。

上記パッケージのすべては、次の pip コマンドを使用して Python パッケージ インデックス(PyPI)からインストールできます。

sudo pip install lxml==2.3.5

お使いのプラットフォームによっては、これらのライブラリをインストールするのに、ビルド サポートツールや Python ソースをインストールしなければならない場合があります。

  • Linux の場合、パッケージ マネージャによってこれらの前提条件を提供できます。多くの場合、パッケージ マネージャはライブラリのビルド済みバージョンを提供することもできます。
  • Windows の場合、通常は、ビルド済みバージョンのインストーラを入手できます。
  • macOS の場合、一部のパッケージをビルドするには、Xcode コマンドライン ツールが必要です。

開発用サーバーでは、app.yaml 内に指定されているバージョンに関係なく、ローカルにインストールされているパッケージ パージョンが使用されます。必要に応じて、プロジェクトの virtualenv を設定して、正確なパッケージ バージョンを指定してください。virtualenv は、これらのバイナリ パッケージでローカルにのみ使用され、デプロイ済みのアプリケーションには使用できないことに注意してください。別のサードパーティ ライブラリを追加するには、ライブラリのインストールで説明されている方法を使用します。

ローカル開発用サーバーで Django を使用する

Django は、さまざまな機能を備えた、Python 用のウェブ アプリケーション フレームワークです。ディスパッチ、ビュー、ミドルウェア、テンプレート用コンポーネントをはじめ、互換性のある多数のコンポーネントが用意されています。

Django データ モデリング インターフェースは、App Engine データストアとの互換性がありません。Django アプリケーションでは、App Engine データ モデリング ライブラリ(db または ndb)を使用できます。ただし、Django データ モデリング インターフェースを使用するサードパーティの Django アプリケーション(特に Django の Admin アプリケーション)は、App Engine で直接動作しない可能性があります。

データストア モデリング ライブラリ(DB)がデフォルトです。代わりに NDB ストレージ API を Django で使用するには、'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware', を Django の settings.py ファイルの MIDDLEWARE_CLASSES エントリに追加します。追加する際には、他のミドルウェア クラスの前に挿入することをおすすめします。このミドルウェアより前にデータストア呼び出しを行う他のミドルウェアが呼び出されると、それが正常に処理されないことがあるためです。Django ミドルウェアに関する詳細は、プロジェクトのドキュメントをご覧ください。

アプリで Django を有効にするには、次のように app.yaml で WSGI アプリケーションと Django ライブラリを指定します。

...
handlers:
- url: /.*
  script: main.app  # a WSGI application in the main module's global scope

libraries:
- name: django
  version: "1.4"

DJANGO_SETTINGS_MODULE 環境変数は、パッケージをインポートする前に、Django 設定モジュールの名前(通常は 'settings')に設定しておく必要があります。

Django 設定モジュールが settings.py 以外の場合は、それに応じて app.yaml ファイルでも DJANGO_SETTINGS_MODULE 環境変数を設定します。

env_variables:
  DJANGO_SETTINGS_MODULE: 'myapp.settings'

または、Python コードで次のように設定します。

import os
# specify the name of your settings module
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

import django.core.handlers.wsgi
app = django.core.handlers.wsgi.WSGIHandler()

ローカル開発用サーバーで matplotlib を使用する

matplotlib は、さまざまな画像形式でグラフや図を作成するプロット ライブラリです。App Engine では、matplotlib のインタラクティブ モードはサポートされていません。また、他の多くの機能もご利用いただけません。つまり、多くの matplotlib チュートリアルで示されているとおり、pyplot.show() は使用できません。代わりに、画像データを出力ストリームに書き込む pyplot.savefig()cStringIO.StringIO インスタンス、または Cloud Storage クライアント ライブラリを使う Google Cloud Storage を使用してください。

Matplotlib では、matplotlibrc 構成ファイルを使用して幅広いカスタマイズを行えます。この構成ファイルは、アプリケーションの最上位ディレクトリに配置してください。あるいは、MATPLOTLIBRC 環境変数に、アプリケーションのディレクトリへの相対パスを設定してください。

デフォルトのバックエンドである AGG では、サポートされているすべての形式(PNG(デフォルト)、RAW、PS、PDF、SVG、SVGZ)のファイルを書き込めます。app.yamllibraries セクションに PIL を追加して PIL ライブラリを使用できるようにすると、自動的に JPEG 画像と TIFF 画像での書き込みも AGG バックエンドでサポートされます。

matplotlib には、自動的に使用できるさまざまなフォントが付属しています。カスタムのフォントを使用するには、アプリケーションとともにそのフォントを TTF 形式でアップロードし、フォントが格納されているパス(アプリケーションのディレクトリに対する相対パス)を TTFPATH 環境変数に設定します。詳細については、app.yaml リファレンスをご覧ください。

App Engine では matplotlib のいくつかの機能がサポートされません。具体的には次のとおりです:

  • ~/.matplotlib ディレクトリはありません。ただし、上述のとおり matplotlibrcmatplotlibrc 構成ファイルは別の場所に格納されます。
  • インタラクティブなバックエンドと GUI 要素はサポートされません。
  • EMF、Cairo、GDK の各バックエンドはサポートされません。
  • キャッシングが行われないため、通常であればキャッシュされるデータは、さまざまなメカニズムにより再計算または再ダウンロードされます。無効になっているキャッシュ保存メカニズムには、たとえば、フォントデータ(matplotlib.font_manager.FontManager.findfont により計算)、サンプルデータ(matplotlib.cbook.get_sample_data によりダウンロード)、財務データ(matplotlib.finance.fetch_historical_yahoo によりダウンロード)があります。
    • キャッシュ保存されないため、examples.downloadFalse に設定されていない限り、asfileobj=False を指定して [matplotlib.cbook.get_sample_data](http://matplotlib.org/api/cbook_api.html#matplotlib.cbook.get_sample_data) を呼び出すことはできません。
  • 外部コマンドを呼び出す機能はすべて無効になっています。
    • fontconfig は使用できません。フォントは上記のメカニズムで検出されます。
    • テキストの表示に LaTeX を使用することはサポートされません。text.usetexTrue に設定しても機能しません。
    • 外部の PostScript ディスティラー プログラムの使用はサポートされません。ps.usedistillerghostscriptxpdf に設定しても機能しません。
    • 外部の動画エンコード プログラムの使用はサポートされません。matplotlib.animation.Animation.save メソッドが機能しないため、matplotlib.animation パッケージは使用できません。
    • matplotlib.cbook.report_memory 関数と matplotlib.cbook.MemoryMonitor クラスはサポートされません。
  • matplotlib.test 関数は無効になっています。

次のステップ