サイトのトップへ戻る

Google App Engine ドキュメント日本語訳

Python ランタイム環境

Python用Google App Engine へようこそ! App Engineを使えば、プログラム言語 Python を使ってウェブアプリケーションを構築でき、プロの開発者がワールドクラスのアプリケーションを構築するのに使っている多くのPython用ライブラリ・ツール・フレームワークを使用できます。 あなたの Python アプリケーションはGoogleの拡張可能なインフラ上で動作し、大規模で安定したストレージとサービスを使用します。

  1. はじめに
  2. Python のランタイムを選択する
  3. サンドボックス
  4. 純正Python
  5. Python SDK とツール


はじめに

App Engine は、セキュア"サンドボックス"環境に事前に読み込んだPython インタプリタを使ってPythonアプリケーションのコードを実行します。 あなたのアプリはこの環境とやり取りをすることでウェブのリクエストを受信し、処理を実行し、応答を返します。

Python ウェブアプリはWSGI プロトコルを使って App Engine ウェブサーバとやり取りをするので、アプリはWSGI互換のウェブアプリケーションフレームワークを使用することができます。 App Engine には、webapp2と呼ばれる簡単に使えるシンプルなウェブフレームワークが含まれています。 大規模アプリケーションの場合は、Djangoのようなメジャーなサードパーティ製フレームワークを使った方が良いでしょう。

この Python インタプリタでは、Python 標準ライブラリ以外にもあなたがアプリにインクルードしたPython モジュールを含む、任意のPythonコードを実行できます。 このインタプリタはCコードで書かれたPythonモジュールを読み込むことはできません; "純正の" Python 環境になります。

セキュア "サンドボックス" 環境は、安全性とセキュリティのためにあなたのアプリケーションを分離します。 これにより、アプリは他のアプリのパフォーマンスと拡張性に干渉しないアクションのみを実行できます。 例えば、アプリはデータをローカルファイルシステムに書き込んだり、勝手にネットワークコネクションを作成したりできません。 その代わり、App Engineが提供している、データを保存したりインターネット上で通信ができる拡張可能なサービスを使用します。 アプリがサンドボックスの制限によって使用できない標準ライブラリからモジュールをインポートしようとした時、Pythonインタプリタは例外を発生させます。

App Engine プラットフォームは、あなたがコード上から呼び出すことができる サービス をたくさん提供しています。 また、アプリケーションでは指定した間隔で実行されるスケジュールタスクを実行することもできます。

まだ見ていない場合は、Python と Google App Engineを使ったウェブアプリケーションの開発を対話的に学ぶことができる Python 2.7 入門ガイドを参照してください。



Python のランタイムを選択する

Python SDKのappcfg.pyという名前のツールにapp.yamlという名前の設定ファイルと合わせて使用することで、 App Engineにアプリケーションが使用するPythonランタイム環境を指示することができます。

app.yamlファイルでruntimeエレメントを指定します。Python 2.7を使用するには、app.yamlファイルに以下を記載してください:


runtime: python27
api_version: 1
threadsafe: true
...

最初のエレメント runtimeで、Python のランタイム環境を選択します。

二番目のエレメント api_versionで、使用するPythonランタイム環境のバージョンを選択します。 これを書いている時点では、App Engineが持っているPython ランタイム環境のバージョンは 1だけです。 App Engineの開発チームが既存のコードと互換性のない環境への変更をリリースする必要がある場合に、このバージョン情報を新しくしたうえで変更を行います。 アプリのapi_version設定を変更してアップロードするまでは、アプリは選択したバージョンのラインタイムを使い続けます。

app.yamlappcfg.pyの詳細情報については、Python アプリケーション設定Python 2.7への移行アプリのアップロードを参照してください。



サンドボックス

複数のウェブサーバーにまたがったアプリケーションへのリクエストを分散し、アプリケーションが別のアプリケーションへ干渉しないようにするために、 App Engineでは制限された"サンドボックス"環境内でアプリケーションを実行させます。 この"サンドボックス"環境では、アプリケーションはコードを実行し、App Engineデータストア内でデータを保存したり呼び出したり、App EngineメールやURLフェッチやusers サービスを使用したり、ユーザーのウェブリクエストを精査して応答の準備をしたりできます。

App Engine アプリケーションでは以下のことができません:

  • ファイルシステムへの書き込み。データを永続的に保存する場合、アプリケーションはApp Engine データストアを使用しなければなりません。ファイルシステムからの読み込みは可能で、アプリケーションと一緒にアップロードされた全てのファイルも読み込み可能です。

  • ゆっくり応答する。アプリケーションへのウェブからのリクエストは、数秒以内に処理されなければなりません。 応答にかなり時間がかかるプロセスは、ウェブサーバーへの負荷を避けるために終了されます。

  • 他の種類のシステムコールを作成する。



Pythonのサンドボックス機能

Python 2.7 ランタイムではPython バイトコードへのアクセスは制限されていません。バイトコードの生成や操作を行うライブラリ(例えば jinja2 テンプレートライブラリ)はこのランタイム上で動作することができます。 Python 2.5 ランタイムではPython バイトコードの操作は許可されていません。

Python 2.7ランタイムを使用している場合は、.pycファイルをアップロードして使用することができますが、同じバージョンの.py ファイルと .pycファイルをアップロードすることはできません。 .pyファイルや.pycファイル(もしくはそれらの組み合わせ)を含んだzipファイルをアップロードすることができます。 .pyc ファイルをアップロードする場合、重要な注意点がいくつかあります:

  • CGI スクリプトの場合、.pyc拡張子のファイルをアップロードしていたとしても、スクリプトハンドラ.py拡張子のファイルを使用します。
  • 既定では、.pyc ファイルの配置はappcfgによってスキップされます。 .pycファイルの配置がスキップされ無いようにするためには、app.yamlファイルのskip_files 項目を上書きする必要があります。
  • .pycファイルをビルドするにはPython 2.7 を使用しなければなりません。 開発しているマシーン上で別のバージョンの Python (Python 2.6のような)を使用している場合は、 互換性のある.pycファイルをビルドするためにバージョン2.7を取得する必要があります。

thread モジュールや threading モジュールを使用しているPython 2.7では、スレッドを作成することができます。 リクエストが終了するとスレッドはランタイムによって結合されるため、リクエスト終了後はスレッドは実行できなくなるので注意してください。 バックエンドサーバーでは、バックグラウンドスレッドを起動することができます; バックグラウンドスレッドは、自身を起動したリクエストよりも "長生き" します。



純正Python

Python ランタイム環境で動作する全てのコードは 純正Pythonでなければならず、C 拡張子やその他コンパイルが必要なコードを含んではいけません。

ランタイム環境には Python 標準ライブラリが含まれています。 ネットワーク機能やファイルシステムへの書き込み機能などはApp Engineでサポートされていないため、それらのコア機能を持ついくつかのモジュールは使用できません。 加えて、 osモジュールは使用できますが、サポートされておらず使えない機能があります。 サポートされていないモジュールをインポートしようとしたり、サポートされていない機能を使おうとすると、例外が発生します。

標準ライブラリのいくつかはApp Engineで動作するように置き換えられたりカスタマイズされたりしています。二つのPythonランタイムの間で、これらのモジュールは以下で説明するような違いがあります。



Python 2.7でカスタマイズされたライブラリ

Python 2.7 ランタイムでは、以下のモジュールが置き換えられたりカスタマイズされたりしています。:

  • tempfile は使用できません。 TemporaryFile 以外は StringIOへと名前を変えました。

  • logging が使用可能になっており、これの使用を強く推奨します! 詳細はログ機能を参照してください。

Python 標準ライブラリと App Engine ライブラリに加えて、 Python 2.7 ランタイムには いくつかの サードパーティ製ライブラリが含まれています。



サードパーティ製 Python ライブラリを追加する

あなたのアプリケーションディレクトリにコードをきじゅるすることで、アプリケーションにサードパーティ製 Python ライブラリをインクルードできます。 アプリケーションディレクトリにモジュールのディレクトリへのシンボリックリンクを作成すると、appcfg.py ファイルはそのリンクに従ってあなたのアプリにモジュールをインクルードします。

Python モジュールは、アプリケーションのルートディレクトリ(app.yaml ファイルがあるディレクトリ)を含むパスをインクルードします。 あなたがアプリケーションのルートディテクトリに作成したモジュールは、ルートからのパスを使うことで使用可能です。 Python はサブディレクトリをパッケージとして認識するので、サブディレクトリに__init__.pyファイルを作成するのを忘れないでください。



Python SDK とツール

App Engine Python SDK には、アプリケーションをテストし、アプリケーションのファイルをアップロードし、データストアのインデックスを管理し、ログデータをダウンロードし、データストアへ大量のデータをアップロードするためのツールが含まれています。

デベロップメントサーバを使うと、あなたのアプリケーションをローカル環境でテストすることができます。 このサーバではApp Engineデータストア、サービス、サンドボックス制限をシミュレートします。 デベロップメントサーバ では、テスト中のアプリクエリー処理に基づくデータストアインデックスの設定を生成することもできます。

appcfg.pyと呼ばれる多目的ツールでは、App Engine上で動作するアプリケーションとのコマンドラインでの全てのやり取りを制御します。 appcfg.py はあなたのアプリケーションを App Engineにアップロードしたり、単にデータストアインデックスの設定を変更してコードを更新する前に新たなインデックスを構築したりもできます。 またアプリのログデータもダウンロードできるので、あなたの独自ツールを使ってアプリのパフォーマンスを解析することもできます。