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, infrom 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) を実行
ブレークポイントで止めることができるようになった。