Eseguire il debug remoto del codice Python in Linux in Visual Studio

Questo articolo illustra come configurare l'installazione di Visual Studio per supportare il debug del codice Python in computer Linux remoti. Questa procedura dettagliata si basa su Visual Studio 2019 versione 16.6.

Visual Studio può avviare ed eseguire il debug di applicazioni Python in locale e in remoto in un computer Windows. Visual Studio supporta anche il debug in remoto in un sistema operativo, un dispositivo o un'implementazione Python diversa da CPython usando la libreria debugpy.

Visual Studio 2019 versione 16.4 e versioni precedenti usa la libreria ptvsd. In Visual Studio 2019 versione 16.5 e successive la libreria debugpy sostituisce ptvsd. Quando si usa debugpy, il codice Python sottoposto a debug ospita il server di debug a cui è possibile collegare Visual Studio. Questo hosting richiede una piccola modifica al codice per importare e abilitare il server. Potrebbe anche essere necessario modificare le configurazioni di rete o firewall nel computer remoto per consentire le connessioni TCP.

Prerequisiti

  • Visual Studio installato con il supporto per i carichi di lavoro Python. Per altre informazioni, vedere Installare il supporto python in Visual Studio.

  • Un computer remoto che esegue Python in un sistema operativo come Mac OSX o Linux.

  • La porta 5678 (in ingresso) viene aperta nel firewall del computer remoto, ovvero l'impostazione predefinita per il debug remoto.

Impostare un computer Linux

È possibile creare facilmente una macchina virtuale Linux in Azure e accedervi usando Desktop remoto da Windows. Ubuntu per la macchina virtuale è utile perché Python è installato per impostazione predefinita. Se si ha una configurazione diversa, vedere Installare interpreti Python per altri percorsi di download di Python.

Configurare il firewall

La porta in ingresso 5678 deve essere aperta nel firewall del computer remoto per supportare il debug remoto.

Per informazioni dettagliate su come creare una regola del firewall per una macchina virtuale di Azure, vedere gli articoli seguenti:

Preparare lo script per il debug

Seguire questa procedura per preparare uno script per il debug del codice Python in Linux.

  1. Nel computer remoto creare un file Python denominato guessing-game.py con il codice seguente:

    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. Installare il pacchetto nell'ambiente debugpy usando il pip3 install debugpy comando .

    Nota

    È consigliabile registrare la versione di debugpy installata nel caso in cui sia necessaria per la risoluzione dei problemi. L'elenco debugpy mostra anche le versioni disponibili.

  3. Abilitare il debug remoto aggiungendo il codice seguente all'inizio del file guessing-game.py prima di altro codice. Anche se non è un requisito vincolante, non è possibile eseguire il debug di qualsiasi thread in background generato prima della chiamata della funzione listen.

    import debugpy
    debugpy.listen(('0.0.0.0', 5678))
    
  4. Salvare il file ed eseguire il programma:

    python3 guessing-game.py
    

    La chiamata alla listen funzione viene eseguita in background e attende le connessioni in ingresso durante l'interazione con il programma. Se lo si desidera, è possibile chiamare la wait_for_client funzione dopo aver chiamato la listen funzione per bloccare il programma fino al collegamento del debugger.

Suggerimento

Oltre alle listen funzioni e wait_for_client , debugpy fornisce anche una funzione breakpointhelper . Questa funzione funge da punto di interruzione a livello di codice se il debugger è collegato. Un'altra funzione, is_client_connected1, restituisce True se il debugger è collegato. Non è necessario controllare questo risultato prima di chiamare altre debugpy funzioni.

Collegarsi in remoto da Python Tools

I passaggi seguenti illustrano come impostare un punto di interruzione per arrestare il processo remoto.

  1. Creare una copia del file remoto nel computer locale e aprirlo in Visual Studio. La posizione del file non è importante, ma il relativo nome deve corrispondere al nome dello script nel computer remoto.

  2. (Facoltativo) Per avere IntelliSense per debugpy nel computer locale, installare il pacchetto debugpy nell'ambiente Python.

  3. Selezionare Debug>Associa a processo.

  4. Nella finestra di dialogo Connetti a processo impostare Connessione ion Tipo su Python remoto (debugpy).In the Attach to Process dialog, set Connessione ion Type to Python remote (debugpy).

  5. Nel campo destinazione Connessione immettere il comando tcp://<ip_address>:5678.

    • tcp:// specifica il tipo di connessione come TCP (Transmission Control Protocol).
    • <ip_address> è l'indirizzo IP del computer remoto, che può essere un indirizzo esplicito o un nome come myvm.cloudapp.net.
    • :5678 è il numero di porta di debug remoto.
  6. Selezionare Invio per popolare l'elenco dei processi debugpy disponibili nel computer:

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

    Se si avvia un altro programma nel computer remoto dopo la compilazione di questo elenco, selezionare il pulsante Aggiorna.

  7. Selezionare il processo di debug e selezionare Connetti oppure fare doppio clic sul processo.

  8. Visual Studio passa alla modalità di debug mentre lo script continua a essere eseguito nel computer remoto, fornendo tutte le normali funzionalità di debug.

    È possibile impostare un punto di interruzione sulla if guess < number: riga, quindi passare al computer remoto e immettere un'altra ipotesi. Visual Studio nel computer locale si arresta nel punto di interruzione, mostra le variabili locali e così via:

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

  9. Quando si arresta il debug, Visual Studio si disconnette dal programma. Il programma continua a essere eseguito nel computer remoto. debugpy continua anche l'ascolto per il collegamento dei debugger, in modo da poter ricollegare il processo in qualsiasi momento.

Risolvere i problemi di connessione

Esaminare i punti seguenti per risolvere i problemi relativi alla connessione.

  • Assicurarsi di selezionare Python remoto (debugpy) per il tipo di Connessione ion.

  • Verificare che il segreto nella destinazione Connessione ion corrisponda esattamente al segreto nel codice remoto.

  • Verificare che l'indirizzo IP nella destinazione Connessione corrisponda a quello del computer remoto.

  • Verificare che la porta di debug remoto nel computer remoto sia aperta e che la destinazione di connessione includa il suffisso della porta, ad esempio :5678.

    Per usare una porta diversa, specificare il numero di porta nella chiamata alla listen funzione, come in debugpy.listen((host, port)). In questo caso, assicurarsi di aprire la porta specifica nel firewall.

  • Verificare che la versione di debugpy installata nel computer remoto (come restituito dal pip3 list comando) corrisponda alla versione di Visual Studio Python Tools (PTVS).

    Nella tabella seguente sono elencate le coppie di versione valide. Se necessario, aggiornare la versione di debugpy nel computer remoto.

    Visual Studio Python Tools debugpy
    2019 16.6 1.0.0b5 1.0.0b5
    2019 16.5 1.0.0b1 1.0.0b1

Nota

Visual Studio 2019 versione 16.0-16.4 ha usato ptvsd, non debugpy. Il processo in questa procedura dettagliata per tali versioni è simile, ma i nomi delle funzioni sono diversi. Visual Studio 2019 versione 16.5 usa debugpy, ma i nomi delle funzioni sono uguali a quelli in ptvsd. Invece di listen, si userebbe enable_attach. Invece di wait_for_client, si userebbe wait_for_attach. Invece di breakpoint, si userebbe break_into_debugger.

Usare ptvsd 3.x per il debug legacy

Il debugger legacy ptvsd 3.x è l'impostazione predefinita in Visual Studio 2017 versione 15.7 e precedenti.

A seconda della configurazione di Visual Studio, potrebbe essere necessario usare ptvsd 3.x per il debug remoto:

  • Visual Studio 2017 versione 15.7 e precedenti con Python 2.6, da 3.1 a 3.4 o IronPython
  • Visual Studio 2019 versione 16.5 e successive con Python 2.6, da 3.1 a 3.4 o IronPython
  • Versioni precedenti della versione 4.x

Se la configurazione implementa uno scenario di versione precedente, Visual Studio visualizza l'errore Debugger non supporta questo ambiente Python.

Configurare il debug remoto

Per preparare il debug remoto con ptvsd 3.x, completare i passaggi seguenti:

  1. Configurare il segreto, usato per limitare l'accesso allo script in esecuzione.

    In ptvsd 3.x, la enable_attach funzione richiede di passare un "segreto" come primo argomento.

    • Quando si collega il debugger remoto, immettere il segreto con il enable_attach(secret="<secret>") comando .

    Sebbene sia possibile consentire a chiunque di connettersi usando il enable_attach(secret=None) comando , questa opzione non è consigliata.

  2. Creare l'URL di destinazione della connessione nel formato tcp://<secret>@<ip_address>:5678.

    • tcp:// specifica il tipo di connessione come TCP.
    • <secret> è la stringa passata con la enable_attach funzione nel codice Python.
    • <ip_address> è l'indirizzo IP del computer remoto, che può essere un indirizzo esplicito o un nome come myvm.cloudapp.net.
    • :5678 è il numero di porta di debug remoto.

Connessione sicura con il protocollo TCPS

Per impostazione predefinita, la connessione al server di debug remoto ptvsd 3.x è protetta solo dal segreto e tutti i dati vengono passati in testo normale. Per una connessione più sicura, ptvsd 3.x supporta SSL usando il formato sicuro del protocollo TCP o TCPS.

Per configurare ptvsd 3.x per usare il protocollo TCPS, seguire questa procedura:

  1. Nel computer remoto usare il openssl comando per generare file separati per la chiave e il certificato autofirmato:

    openssl req -new -x509 -days 365 -nodes -out cert.cer -keyout cert.key
    
    • openssl Al prompt immettere il nome host o l'indirizzo IP usato per connettersi al nome comune.

    Per altre informazioni, vedere Certificati autofirmato nella documentazione del modulo Python ssl . Si noti che il comando descritto nella documentazione di Python genera solo un singolo file combinato.

  2. Nel codice modificare la chiamata alla enable_attach funzione per includere certfile gli argomenti e keyfile usando i nomi file come valori. Questi argomenti hanno lo stesso significato della funzione Python standard ssl.wrap_socket .

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

    È anche possibile apportare la stessa modifica nel file di codice nel computer locale. Poiché questo codice non viene effettivamente eseguito, non è strettamente necessario.

  3. Riavviare il programma Python nel computer remoto in modo che sia pronto per il debug.

  4. Proteggere il canale aggiungendo il certificato alla CA radice attendibile nel computer Windows con Visual Studio:

    1. Copiare il file del certificato dal computer remoto al computer locale.

    2. Aprire Pannello di controllo e passare a Strumenti>di Windows Gestisci certificati computer.

    3. Nella finestra di dialogo certlm [Certificati - computer locale] espandere il nodo Autorità di certificazione radice attendibili, fare clic con il pulsante destro del mouse su Certificati e selezionare Tutte le attività>Importa.

    4. Passare a e selezionare il file .cer copiato dal computer remoto.

    5. Continuare con la finestra di dialogo per completare il processo di importazione.

  5. Ripetere il processo di collegamento in Visual Studio, come descritto in precedenza in Collegare in remoto da Python Tools.

    Per questa istanza, definire tcps:// come protocollo per la destinazione di Connessione ion (o qualificatore).

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

Risolvere i problemi di connessione

Durante il tentativo di connessione, Visual Studio potrebbe riscontrare problemi. Esaminare gli scenari seguenti e intervenire in base alle esigenze.

  • Visual Studio segnala potenziali problemi di certificato durante la connessione tramite SSL.

    Azione: è possibile ignorare il messaggio e continuare.

    Attenzione

    Tenere presente che, anche se il canale è ancora crittografato contro l'intercettazione, può essere aperto agli attacchi man-in-the-middle.

  • Visual Studio visualizza il certificato remoto non è attendibile .

    Problema: il certificato non viene aggiunto correttamente alla CA radice attendibile.

    Azione: controllare di nuovo i passaggi per aggiungere il certificato alla CA radice attendibile nel computer Windows e riprovare la connessione.

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

  • Visual Studio visualizza il nome del certificato remoto non corrisponde all'avviso nome host.

    Problema: il nome host o l'indirizzo IP appropriato non è specificato per il nome comune per il certificato.

    Azione: controllare di nuovo i passaggi descritti in Proteggere la connessione con TCPS. Assicurarsi di usare il nome comune corretto quando si crea il certificato e riprovare la connessione.

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