Rasberry PI上で動作するPythonをVisual Studio Codeからリモートデバッグする

Visual Studio Codeがあれば何でもできる気がしてきた。





VSCodeの拡張機能SSH FSをインストール



エクスプローラに SSH FILE SYSTEMS が追加されるので右クリックしてCreate a SSH FS configuration

Windowの場合PuTTYが必要とのこと。

ssh-fs

Nameは任意
Locationは設定ファイルの場所
GrobalはVsCode自体に設定される。
Workspaceはディレクトリ単位、ディレクトリを開いておく必要がある。

環境毎にWorkspaceを用意する方がいいかも。

ssh-fs

Host:raspberrypi3plus.local or IPアドレス
Username:pi
Password:[ラズベリーパイに設定されているパスワード]
Root:接続時のトップディレクトリ

Username, Passwordは設定しない場合接続時に入力する(password: true を設定する必要あり)。

Workspaceに保存した場合.vscode/settings.jsonファイルが作成される。

{
    "sshfs.configs": [
        {
            "host": "raspberrypi3plus.local",
            "name": "pi",
            "username": "pi",
            "password": true
        }
    ]
}

接続したい場合はSSH FILE SYSTEMSの接続対象を右クリック → Connect as Workspqce folder





Raspberry PI上にPythonプログラムを作成する




SSHなどで接続してラズパイ上で作成してもいいがここまでの手順でVSCode上から作成することもできるようになっている。

サンプルコード


/home/pi/project/dtest/main.py (Raspberry pi)

import sys
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    msg = "Hello remote debug!"
    return msg
    
if __name__ == '__main__':
    # デバッグ時の処理
    if (len(sys.argv) > 1) and (sys.argv[1] == "debug"):
        import ptvsd
        print("Waiting attach debugger...")
        ptvsd.enable_attach(address=('0.0.0.0', 30001))
        ptvsd.wait_for_attach()
    app.run(host="0.0.0.0", port=3000, debug=False)

debug=TrueにしておくとFlaskのデバッグ機能と競合してうまく動作しない。

動作確認

ラズパイにSSHなどで接続して以下のコマンド

ssh pi@raspberrypi3plus.local
cd project/dtest/
python3 main.py

ラズパイ上でブラウザを開いて
http://127.0.0.1:3000/
へアクセス
あるいは同一ネットワーク上のPCから
http://raspberrypi3plus.local:3000/
へアクセス(IPアドレス指定だとうまくいかないかも)

ライブラリが足りていない場合インストール(恐らく初期状態だとptvsdがない)
pip3 install ptvsd


"Hello remote debug!"

と表示されたら成功




参考


Visual Studio Codeからリモートデバッグする。
.vscode/launch.json に以下を追記。なければ作成。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "attach",
            "pathMappings": [
                {
                    "localRoot": "ssh://pi",
                    "remoteRoot": "/home/pi/project"
                }
            ],
            "port": 30001,
            "host": "raspberrypi3plus.local"
        }
    ]
}

localrootは恐らく
ssh://[設定名]/
になる。
Ctrl(Cmd)+Shift+P → Open Workspace Configuration FileのSSF FSから確認できる。

remoteRoot はラズパイ上へのルートパス
恐らくSSHで接続した時のRootを指定する。

portはデバッグ用のポート番号。
ptvsd.enable_attach(address=('0.0.0.0', 30001)) で指定している(使用されていない)ポート番号。

host
ホスト名かIPアドレスを指定。

引数debugを付与してラズパイのpythonプログラム起動。


python3 main.py debug

return msgあたりにブレイクポイントを貼ってデバッグ実行(F5)

http://raspberrypi3plus.local:3000/
にアクセスして確認。

VSCodeでリモートデバッグ



参考



https://qiita.com/sinsi404/items/dd0afe1ed038d542d1f1
https://qiita.com/informationsea/items/5c9f05c81a41fb885460
https://donjayamanne.github.io/pythonVSCodeDocs/docs/debugging_remote-debugging/
https://community.plot.ly/t/code-in-if---name-----main---runs-twice/5868


2019年5月28日火曜日