Google App Engine の Flask サンプルを VS Code から実行・デバッグする

基本的に、https://cloud.google.com/appengine/docs/standard/python/getting-started/python-standard-env を実現する。

サンプルを、以下から入手

  1. 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)を変更する。

  1. PYTHON_HOME%\Scripts
  2. 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 にデプロイ時にアップロードされる。

  1. (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のパスに変更する。

  1. {
  2. "version": "0.1.0",
  3. "command": "python",
  4. "isShellCommand": true,
  5. "showOutput": "always",
  6. "args": [
  7. "C:\\Programs\\Google\\Cloud SDK\\google-cloud-sdk\\bin\\dev_appserver.py",
  8. "--python_startup_script=${workspaceFolder}/pydev_startup.py",
  9. "--automatic_restart=no",
  10. "--max_module_instances=default:1",
  11. "${workspaceFolder}/app.yaml"
  12. ]
  13. }

3.3 デバッグ構成

デバッグビューのトップバーにある歯車アイコンをクリックすると、VS Codeはワークスペースの.vscodeフォルダーの下にlaunch.jsonファイルを作成するので、以下のエントリを追加

https://vscode-doc-jp.github.io/docs/userguide/debugging.html

  1. {
  2. "name": "Python: GAE(Attach)",
  3. "type": "python",
  4. "request": "attach",
  5. "localRoot": "${workspaceFolder}",
  6. "remoteRoot": "${workspaceFolder}",
  7. "port": 3000,
  8. "secret": "gae",
  9. "host": "localhost",
  10. "preLaunchTask": "python"
  11. },

3.トラブルシュート

実行で、以下のようなエラーが出る。

  1. Traceback (most recent call last):
  2. File "C:\Programs\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 240, in Handle
  3. handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  4. File "C:\Programs\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 299, in _LoadHandler
  5. handler, path, err = LoadObject(self._handler)
  6. File "C:\Programs\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 85, in LoadObject
  7. obj = __import__(path[0])
  8. File "C:\workspaces\gcp\dokobingo\main.py", line 19, in
  9. from flask import Flask, render_template, request
  10. ImportError: No module named flask

https://github.com/pallets/click/issues/594

を参考に、appengine_config.py を以下に書き換える

  1. import os
  2. import sys
  3. from google.appengine.ext import vendor
  4. vendor.add('lib')
  5.  
  6. print os.environ.get('SERVER_SOFTWARE', '')
  7.  
  8. if os.environ.get('SERVER_SOFTWARE', '').startswith('Google App Engine'):
  9. sys.path.insert(0, 'lib.zip')
  10. else:
  11. if os.name == 'nt':
  12. os.name = None
  13. sys.platform = ''

4.実行

本来は、デバッグビューから、上記3.3で追加した構成を実行すればよいはずだが、うまくアタッチされないため、別々に実行する。

run_debug

4.1 開発サーバーの実行

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

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

debug_desktop

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

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です