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で追加した構成を実行すればよいはずだが、うまくアタッチされないため、別々に実行する。

run_debug

4.1 開発サーバーの実行

コマンドパレット(Ctrl+Shift+p) から、ビルドタスクの実行。これで開発サーバーが起動される。run_task

4.2 その後、デバッグビューから、Python:GAE(Attach) を実行

debug_desktop

ブレークポイントで止めることができるようになった。