VSCodeからルート以外に配置したアプリケーションがデバッグ起動できない問題

VSCodeからルート以外に配置したアプリケーションがデバッグ起動できない問題の解決方法について報告します。

問題の現象

具体的には、以下のようにVSCodeのルートディレクトリよりも深い場所にある”sample.py”を実行できない問題です。

. <-- VSCode のルートフォルダー
app
└── sample
    └── sample.py <-- 実行したいアプリケーション

sample.pyの内容は以下です。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return('Hello!')

app.run(port=8888)

VSCodeの画面は以下となります。

VSCodeの画面

VSCodeにてF5などで実行すると、以下のように”モジュールsampleが見つからない”というエラーとなります。

(learnflask) takamotokeiji@Bourgogne learnflask %  cd /Users/takamotokeiji/github/takamotobiz/learnflask ; /usr/bin/env /Users/takamotokeiji/github/takamotobiz/learnflask/learn
flask/bin/python /Users/takamotokeiji/.vscode/extensions/ms-python.python-2022.0.1786462952/pythonFiles/lib/python/debugpy/launcher 60274 -- /Users/takamotokeiji/github/takamot
obiz/learnflask/app/sample/sample.py 
 * Tip: There are .env or .flaskenv files present. Do "pip install python-dotenv" to use them.
 * Serving Flask app 'sample' (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
 * Restarting with stat
No module named app

解決方法

以下のように、アプリケーション(sample.py)と同じディレクトリにファイル”.env”を作成することで解決できました。

app
└── sample
    ├── .env
    └── sample.py

ファイル.envには、以下のようにアプリケーション名を記述します。

FLASK_APP=sample.py

.envにて環境変数FLASK_APPを設定するイメージとなります。
この環境変数は、アプリケーション名を指定するようです。

VSCodeからアプリケーションが起動できるようになりました。

(learnflask) takamotokeiji@Bourgogne learnflask %  cd /Users/takamotokeiji/github/takamotobiz/learnflask ; /usr/bin/env /Users/takamotokeiji/github/takamotobiz/learnflask/learn
flask/bin/python /Users/takamotokeiji/.vscode/extensions/ms-python.python-2022.0.1786462952/pythonFiles/lib/python/debugpy/launcher 49894 -- /Users/takamotokeiji/github/takamot
obiz/learnflask/app/sample/sample.py 
 * Serving Flask app 'app' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)

この現象は、VSCodeからデバッグ実行時に、カレントフォルダーからアプリケーション(sample.py)を探して実行しようとしますが、これがNGだった(ルートフォルダーに存在しない)場合に、前述のエラーが出るようです。

ただ、非常に不思議なのですが、.envの内容を空(内にも記載しない)にしてもアプリケーションが起動できます。

launch.jsonによる指定も可能

launch.jsonに.envの指定を追加することで、この問題を解決することもできます。
以下のように、項目"envFile"にて、.envのファイルを指定します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "envFile": ".env",      <-- 追加しました。
            "console": "integratedTerminal"
        }
    ]
}

この場合、ファイル.envには、以下のように起動場所からの相対パス(.で結合)を記述します。

FLASK_APP=app.sample.sample.py

ここでも不思議なことに、ファイル.envの内容は空でも動作してしまいます。。

まとめ

VSCodeが不思議な動きをしているのか、私が大きな勘違いをしているのかわかりませんが、VSCodeからルート以外に配置したアプリケーションがデバッグ起動できないという問題は解決しましたので、今回はここまでとします。

時間があればもう少し調べたいところですが。。

コメントを残す

メールアドレスが公開されることはありません。

4 × 5 =