Google App Engine の Flask サンプルを VS Code から実行・デバッグする
基本的に、https://cloud.google.com/appengine/docs/standard/python/getting-started/python-standard-env を実現する。
サンプルを、以下から入手
- git clone https://github.com/GoogleCloudPlatform/python-docs-samples
入手後、/appengine\standard\flask\tutorial にFlaskのサンプルがある。
VisualStudio Codeで、デバッガを使用したいので、若干調整する。
1.ライブラリのインストール
1.1 実行Pythonの設定
が、、Python3.6、2.7 環境が混在しているため、pip –V でバージョンを確認すると、Python3.6の pip が起動しているため、とりあえず、Python2.7 のpipが起動するように環境変数(PATH)を変更する。
- %PYTHON_HOME%\Scripts
- %PYTHON_HOME%
PYTHON_HOME = C:\Programs\Python27-32 など、Python2.7へのパスを指定
当初、仮想環境を構築しようとしていたが、上記の手順に従うと、pipによりライブラリをインストールする先は、作業フォルダ lib 配下となるため、仮想環境は不要。
また、VS Codeから、ダイレクトにPythonを起動しないため、VS Code の python.pythonPath 設定では対応できない。
1.2 ライブラリをインストール
上記で入手したサンプルコードの、/appengine\standard\flask\tutorial ディレクトリから以下を実行
-t lib フラグを指定することで、ライブラリは 作業フォルダ以下のlib フォルダへコピーされる。App Engine にデプロイ時にアップロードされる。
- (gaeflask) PS C:\workspaces\gcp\dokobingo> pip install -t lib -r requirements.txt
2.VS Code からデバッグを行う
基本的に以下のページに従う。
https://code.visualstudio.com/docs/python/debugging
Google App Engine は自身で起動するため、VS Code デバッガは直接利用できない。代わりに、ptvsd を使用して、Google App Engine をVS Codeがデバッガをアタッチできるモードで起動する。
3.1 ptvsd ダウンロード
https://pypi.python.org/pypi/ptvsd
上記からダウンロード。
VS Code 1.19.1 、Python 2.7 32 bit環境で検証しているが、現時点で最新版の、
pytvsd 3.2.1 ではデバッガがクラッシュしてしまう。3.2.0 、3.1.0 と試したがいずれもNG。
結局 pytvsd 3.0.0 が利用できたのでこちらを使用する。
作業ディレクトリへ展開する。
3.2 タスクの構成
tasks.json の構成を行う。
https://vscode-doc-jp.github.io/docs/userguide/tasks.html
dev_appserver.py のパスをGoogle SDKのパスに変更する。
- {
- "version": "0.1.0",
- "command": "python",
- "isShellCommand": true,
- "showOutput": "always",
- "args": [
- "C:\\Programs\\Google\\Cloud SDK\\google-cloud-sdk\\bin\\dev_appserver.py",
- "--python_startup_script=${workspaceFolder}/pydev_startup.py",
- "--automatic_restart=no",
- "--max_module_instances=default:1",
- "${workspaceFolder}/app.yaml"
- ]
- }
3.3 デバッグ構成
デバッグビューのトップバーにある歯車アイコンをクリックすると、VS Codeはワークスペースの.vscodeフォルダーの下にlaunch.jsonファイルを作成するので、以下のエントリを追加
https://vscode-doc-jp.github.io/docs/userguide/debugging.html
- {
- "name": "Python: GAE(Attach)",
- "type": "python",
- "request": "attach",
- "localRoot": "${workspaceFolder}",
- "remoteRoot": "${workspaceFolder}",
- "port": 3000,
- "secret": "gae",
- "host": "localhost",
- "preLaunchTask": "python"
- },
3.トラブルシュート
実行で、以下のようなエラーが出る。
- Traceback (most recent call last):
- File "C:\Programs\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 240, in Handle
- handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
- File "C:\Programs\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 299, in _LoadHandler
- handler, path, err = LoadObject(self._handler)
- File "C:\Programs\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 85, in LoadObject
- obj = __import__(path[0])
- File "C:\workspaces\gcp\dokobingo\main.py", line 19, in
from flask import Flask, render_template, request ImportError: No module named flask
https://github.com/pallets/click/issues/594
を参考に、appengine_config.py を以下に書き換える
- import os
- import sys
- from google.appengine.ext import vendor
- vendor.add('lib')
- print os.environ.get('SERVER_SOFTWARE', '')
- if os.environ.get('SERVER_SOFTWARE', '').startswith('Google App Engine'):
- sys.path.insert(0, 'lib.zip')
- else:
- if os.name == 'nt':
- os.name = None
- sys.platform = ''
4.実行
本来は、デバッグビューから、上記3.3で追加した構成を実行すればよいはずだが、うまくアタッチされないため、別々に実行する。
4.1 開発サーバーの実行
コマンドパレット(Ctrl+Shift+p) から、ビルドタスクの実行。これで開発サーバーが起動される。
4.2 その後、デバッグビューから、Python:GAE(Attach) を実行
ブレークポイントで止めることができるようになった。