Vzdálené ladění kódu Pythonu v Linuxu v sadě Visual Studio

V tomto článku se dozvíte, jak nakonfigurovat instalaci sady Visual Studio tak, aby podporovala ladění kódu Pythonu na vzdálených počítačích s Linuxem. Tento názorný postup vychází ze sady Visual Studio 2019 verze 16.6.

Visual Studio může spouštět a ladit aplikace Pythonu místně a vzdáleně na počítači s Windows. Visual Studio také podporuje vzdálené ladění v jiném operačním systému, zařízení nebo implementaci Pythonu než CPython pomocí knihovny debugpy.

Visual Studio 2019 verze 16.4 a starší používá knihovnu ptvsd. V sadě Visual Studio 2019 verze 16.5 a novější nahrazuje knihovna debugpy ptvsd. Když používáte debugpy, kód Pythonu, který je laděný, hostuje ladicí server, ke kterému může Visual Studio připojit. Toto hostování vyžaduje malou úpravu kódu pro import a povolení serveru. Možná budete také muset upravit konfiguraci sítě nebo brány firewall na vzdáleném počítači tak, aby umožňovala připojení TCP.

Požadavky

  • Visual Studio nainstalované s podporou úloh Pythonu Další informace najdete v tématu Instalace podpory Pythonu v sadě Visual Studio.

  • Vzdálený počítač s Pythonem v operačním systému, jako je Mac OSX nebo Linux.

  • Port 5678 (příchozí) se otevře v bráně firewall vzdáleného počítače, což je výchozí nastavení pro vzdálené ladění.

Nastavení počítače s Linuxem

Virtuální počítač s Linuxem můžete snadno vytvořit v Azure a přistupovat k němu pomocí vzdálené plochy z Windows. Ubuntu pro virtuální počítač je pohodlné, protože Python je ve výchozím nastavení nainstalovaný. Pokud máte jinou konfiguraci, přečtěte si téma Instalace interpretů Pythonu pro jiná umístění pro stahování Pythonu.

Konfigurace brány firewall

Příchozí port 5678 musí být otevřený v bráně firewall vzdáleného počítače, aby bylo možné podporovat vzdálené ladění.

Podrobnosti o tom, jak vytvořit pravidlo brány firewall pro virtuální počítač Azure, najdete v následujících článcích:

Příprava skriptu pro ladění

Postupujte podle těchto kroků a připravte skript pro ladění kódu Pythonu v Linuxu.

  1. Na vzdáleném počítači vytvořte soubor Pythonu s názvem guessing-game.py s následujícím kódem:

    import random
    
    guesses_made = 0
    name = input('Hello! What is your name?\n')
    number = random.randint(1, 20)
    print('Well, {0}, I am thinking of a number between 1 and 20.'.format(name))
    
    while guesses_made < 6:
        guess = int(input('Take a guess: '))
        guesses_made += 1
        if guess < number:
            print('Your guess is too low.')
        if guess > number:
            print('Your guess is too high.')
        if guess == number:
            break
    if guess == number:
        print('Good job, {0}! You guessed my number in {1} guesses!'.format(name, guesses_made))
    else:
        print('Nope. The number I was thinking of was {0}'.format(number))
    
  2. debugpy Pomocí příkazu nainstalujte balíček do svého prostředípip3 install debugpy.

    Poznámka:

    Je vhodné zaznamenat verzi ladicího programu, která je nainstalovaná v případě, že ji potřebujete pro řešení potíží. V seznamu ladění se také zobrazují dostupné verze.

  3. Povolte vzdálené ladění přidáním následujícího kódu do horní části souboru guessing-game.py před jiným kódem. (I když to není striktní požadavek, není možné ladit žádná vlákna na pozadí, která vznikla před listen zavoláním funkce.)

    import debugpy
    debugpy.listen(('0.0.0.0', 5678))
    
  4. Uložte soubor a spusťte program:

    python3 guessing-game.py
    

    Volání listen funkce běží na pozadí a při interakci s programem čeká na příchozí připojení. V případě potřeby můžete volat wait_for_client funkci po volání listen funkce, která program zablokuje, dokud ladicí program nepřipojí.

Tip

Kromě listen funkcí a wait_for_client funkcí poskytuje debugpy také pomocnou funkci breakpoint. Tato funkce slouží jako programová zarážka, pokud je ladicí program připojen. Další funkce , is_client_connected1vrátí True , pokud je ladicí program připojen. Před voláním jiných debugpy funkcí nemusíte tento výsledek kontrolovat.

Vzdálené připojení z Nástrojů Pythonu

Následující kroky ukazují, jak nastavit zarážku pro zastavení vzdáleného procesu.

  1. Vytvořte kopii vzdáleného souboru v místním počítači a otevřete ho v sadě Visual Studio. Nezáleží na tom, kde se soubor nachází, ale jeho název by se měl shodovat s názvem skriptu na vzdáleném počítači.

  2. (Volitelné) Pokud chcete mít IntelliSense pro ladění na místním počítači, nainstalujte balíček debugpy do prostředí Pythonu.

  3. Vyberte Připojit k procesu ladění>.

  4. V dialogovém okně Připojit k procesu nastavte typ Připojení ion na vzdálený python (debugpy).

  5. Do pole Připojení ion Target (Cíl) zadejte příkaz tcp://<ip_address>:5678.

    • tcp:// určuje typ připojení jako tcp (Transmission Control Protocol).
    • <ip_address> je IP adresa vzdáleného počítače, což může být explicitní adresa nebo název, jako je myvm.cloudapp.net.
    • :5678 je číslo portu vzdáleného ladění.
  6. Výběrem klávesy Enter naplníte seznam dostupných procesů ladění v tomto počítači:

    Screenshot that shows how to enter the connection target to see a list of available debugpy processes.

    Pokud se stane, že po naplnění tohoto seznamu spustíte jiný program na vzdáleném počítači, vyberte tlačítko Aktualizovat .

  7. Vyberte proces, který chcete ladit, a vyberte Připojit, nebo poklikejte na proces.

  8. Visual Studio se přepne do režimu ladění, zatímco skript bude dál běžet na vzdáleném počítači a poskytuje všechny obvyklé možnosti ladění .

    Můžete nastavit zarážku na if guess < number: řádku a pak přepnout na vzdálený počítač a zadat další odhad. Visual Studio na místním počítači se zastaví na zarážce, zobrazí místní proměnné atd.:

    Screenshot that shows how Visual Studio pauses debugging when a breakpoint is hit.

  9. Když zastavíte ladění, Sada Visual Studio se od aplikace odpojila. Program bude dál běžet na vzdáleném počítači. debugpy také pokračuje v naslouchání při připojování ladicíchgerů, takže se k procesu můžete kdykoli znovu připojit.

Řešení potíží s připojením

Projděte si následující body, které vám pomůžou s řešením potíží s připojením.

  • Ujistěte se, že jako typ Připojení ionu vyberete vzdálený python (debugpy).

  • Ověřte, že tajný klíč v cíli Připojení ion přesně odpovídá tajnému kódu ve vzdáleném kódu.

  • Ověřte, že IP adresa v cíli Připojení ion odpovídá adrese vzdáleného počítače.

  • Ověřte, že je otevřený port vzdáleného ladění na vzdáleném počítači a cíl připojení obsahuje příponu portu, například :5678.

    Pokud chcete použít jiný port, zadejte číslo portu ve volání listen funkce, jako v debugpy.listen((host, port)). V takovém případě nezapomeňte otevřít konkrétní port v bráně firewall.

  • Ověřte, že verze ladění nainstalovaná na vzdáleném počítači (vrácená pip3 list příkazem) odpovídá verzi sady Visual Studio Python Tools (PTVS).

    Následující tabulka uvádí platné páry verzí. Podle potřeby aktualizujte verzi ladění na vzdáleném počítači.

    Visual Studio Nástroje Python Tools ladění
    2019 16.6 1.0.0b5 1.0.0b5
    2019 16.5 1.0.0b1 1.0.0b1

Poznámka:

Visual Studio 2019 verze 16.0-16.4 využívalo ptvsd, nikoli ladění. Proces v tomto názorném postupu pro tyto verze je podobný, ale názvy funkcí se liší. Visual Studio 2019 verze 16.5 používá ladicí program, ale názvy funkcí byly stejné jako názvy funkcí v ptvsd. listenMísto , byste použili enable_attach. wait_for_clientMísto , byste použili wait_for_attach. breakpointMísto , byste použili break_into_debugger.

Použití ptvsd 3.x pro starší ladění

Starší ladicí program ptvsd 3.x je výchozí v sadě Visual Studio 2017 verze 15.7 a starší.

V závislosti na konfiguraci sady Visual Studio možná budete muset použít ptvsd 3.x pro vzdálené ladění:

  • Visual Studio 2017 verze 15.7 a starší s Pythonem 2.6, 3.1 až 3.4 nebo IronPython
  • Visual Studio 2019 verze 16.5 a novější s Pythonem 2.6, 3.1 až 3.4 nebo IronPython
  • Dřívější verze 4.x

Pokud vaše konfigurace implementuje scénář starší verze, sada Visual Studio zobrazí chybu, ladicí program nepodporuje toto prostředí Pythonu.

Nastavení vzdáleného ladění

Pokud se chcete připravit na vzdálené ladění pomocí ptvsd 3.x, proveďte následující kroky:

  1. Nastavte tajný kód, který slouží k omezení přístupu ke spuštěném skriptu.

    V ptvsd 3.x funkce vyžaduje, enable_attach abyste jako první argument předali "tajný kód".

    • Když připojíte vzdálený ladicí program, zadejte tajný kód pomocí enable_attach(secret="<secret>") příkazu.

    I když můžete povolit připojení kohokoli pomocí enable_attach(secret=None) příkazu, tato možnost se nedoporučuje.

  2. Vytvořte cílovou adresu URL připojení ve formuláři tcp://<secret>@<ip_address>:5678.

    • tcp:// určuje typ připojení jako TCP.
    • <secret> je řetězec předaný funkcí enable_attach v kódu Pythonu.
    • <ip_address> je IP adresa vzdáleného počítače, což může být explicitní adresa nebo název, jako je myvm.cloudapp.net.
    • :5678 je číslo portu vzdáleného ladění.

Zabezpečené připojení pomocí protokolu TCPS

Ve výchozím nastavení je připojení k vzdálenému ladicího serveru ptvsd 3.x zabezpečené pouze tajným kódem a všechna data se předávají ve formátu prostého textu. Pro bezpečnější připojení podporuje ptvsd 3.x protokol SSL pomocí zabezpečeného formátu protokolu TCP nebo TCPS.

Pomocí následujících kroků nakonfigurujte ptvsd 3.x pro práci s protokolem TCPS:

  1. Na vzdáleném počítači pomocí openssl příkazu vygenerujte samostatné soubory pro klíč a certifikát podepsaný svým držitelem:

    openssl req -new -x509 -days 365 -nodes -out cert.cer -keyout cert.key
    
    • Na příkazovém openssl řádku zadejte název hostitele nebo IP adresu, kterou používáte pro připojení pro běžný název.

    Další informace najdete v tématu Certifikáty podepsané svým držitelem v dokumentaci k modulu Pythonu ssl . Všimněte si, že příkaz popsaný v dokumentaci Pythonu generuje pouze jeden sloučený soubor.

  2. V kódu upravte volání enable_attach funkce tak, aby zahrnovalo certfile a keyfile argumenty pomocí názvů souborů jako hodnot. Tyto argumenty mají stejný význam jako pro standardní ssl.wrap_socket funkci Pythonu.

    ptvsd.enable_attach(secret='my_secret', certfile='cert.cer', keyfile='cert.key')
    

    Stejnou změnu v souboru kódu můžete provést také v místním počítači. Vzhledem k tomu, že se tento kód ve skutečnosti nespustí, není nezbytně nutné.

  3. Restartujte program Pythonu na vzdáleném počítači, aby byl připravený k ladění.

  4. Zabezpečte kanál přidáním certifikátu do důvěryhodné kořenové certifikační autority na počítači s Windows pomocí sady Visual Studio:

    1. Zkopírujte soubor certifikátu ze vzdáleného počítače do místního počítače.

    2. Otevřete Ovládací panely a přejděte do části Nástroje systému>Windows Správa certifikátů počítače.

    3. V dialogovém okně certlm [Certifikáty – místní počítač] rozbalte uzel Důvěryhodné kořenové certifikační autority, klikněte pravým tlačítkem na Certifikáty a vyberte Všechny úlohy>Import.

    4. Vyhledejte a vyberte soubor .cer zkopírovaný ze vzdáleného počítače.

    5. Pokračujte v dialogových výzev k dokončení procesu importu.

  5. Opakujte proces připojení v sadě Visual Studio, jak je popsáno výše v části Připojit vzdáleně z nástrojů Python Tools.

    Pro tuto instanci definujte tcps:// jako protokol pro Připojení ion Target (nebo kvalifikátor).

    Screenshot that shows how to specify TCPS as the remote debugging transport with SSL.

Řešení problémů s připojením

Během pokusu o připojení může visual Studio narazit na problémy. Projděte si následující scénáře a podle potřeby proveďte příslušnou akci.

  • Visual Studio varuje před potenciálními problémy s certifikáty při připojování přes PROTOKOL SSL.

    Akce: Zprávu můžete ignorovat a pokračovat.

    Upozornění

    Mějte na paměti, že i když je kanál stále šifrovaný proti odposlouchávání, může být otevřený útokům man-in-the-middle.

  • Visual Studio zobrazí vzdálené certifikáty, které nejsou důvěryhodné .

    Problém: Certifikát není správně přidaný do důvěryhodné kořenové certifikační autority.

    Akce: Znovu zkontrolujte postup přidání certifikátu do důvěryhodné kořenové certifikační autority na počítači s Windows a zkuste připojení zopakovat.

    Screenshot of the warning that says the remote SSL certificate isn't trusted.

  • Visual Studio zobrazí název vzdáleného certifikátu, který neodpovídá upozornění na název hostitele.

    Problém: Pro běžný název certifikátu není zadaný správný název hostitele nebo IP adresa.

    Akce: Znovu zkontrolujte kroky v části Zabezpečení připojení pomocí protokolu TCPS. Při vytváření certifikátu nezapomeňte použít správný běžný název a zkuste připojení zopakovat.

    Screenshot of the warning that says the remote SSL certificate doesn't match the hostname.