Search code examples
python-3.xvisual-studio-coderemote-debugging

How to debug remote Python script in VS Code


I am doing Python development in Raspberry Pi. I have installed VS Code in my laptop and have installed the ssh extension. Using this I can easily connect to Raspberry Pi. While I am connected I can see that VS Code has also loaded the Python interpreter of Raspberry Pi. I can run my Python script from within the vs code but when I tried to debug the code, nothing happens.

Is it possible to remotely debug the Python script from laptop to Raspberry Pi? How can I enable this?


Solution

  • It is frustrating there are so many out-dated instructions how to remote debug Python scripts from VSC.

    As of August 2024 there is a far easier way to set this up that answers the OP's question which involved VSC being installed on a laptop and debugging a Python script saved on a Raspberry Pi also in the same LAN.

    Once you have installed the Remote SSH extension on your local machine use that to SSH via VSC in to your remote machine. Now install the Python Debugger extension on your remote system.

    Since you have ssh'd in to that remote system via the VSC extension VSC just debugs the script on that remote system as though it is LOCAL.

    1. Place a breakpoint (red dot) on the line you want script execution to stop at.
    2. From File Menu > Run > Start Debugging (F5)... The Command Palette will open and it will say:
    3. Select Debugger <-- Choose Python Debugger
    4. Then choose...
    5. Python File Debug the currently active Python File.
    6. Now use F10, F11 etc to step through the lines of code.

    You DO NOT need to...

    • Do ssh local port forwarding.
    • Separately install debugpy from the command line in your local and remote environments.
    • Run debugpy from the command line.
    • Have a copy of the Python script in your local environment AND another on the remote environment. You only need ONE copy in the remote environment.
    • You don't even need a launch.json.

    I checked about what sockets were opened by separately ssh'ing from a Terminal in to the "remote system" (my Raspberry Pi running Ubuntu) and they are all localhost.

    ubuntu@ubuntu:~$ lsof -i
    COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    code-f1e1 76603 ubuntu    9u  IPv4 519530      0t0  TCP localhost:43675 (LISTEN)
    code-f1e1 76603 ubuntu   12u  IPv4 519534      0t0  TCP localhost:43675->localhost:34540 (ESTABLISHED)
    python    77190 ubuntu    4u  IPv4 520559      0t0  TCP localhost:39819 (LISTEN)
    python    77190 ubuntu    8u  IPv4 522535      0t0  TCP localhost:45381 (LISTEN)
    python    77190 ubuntu    9u  IPv4 521557      0t0  TCP localhost:45381->localhost:59082 (ESTABLISHED)
    python    77190 ubuntu   11u  IPv4 521558      0t0  TCP localhost:35979->localhost:37454 (ESTABLISHED)
    python    77218 ubuntu    3u  IPv4 520157      0t0  TCP localhost:37454->localhost:35979 (ESTABLISHED)
    python    77228 ubuntu    3u  IPv4 520164      0t0  TCP localhost:59082->localhost:45381 (ESTABLISHED)