Come posso eseguire il debug delle app della riga di comando console_script di Python con il debugger VSCode?

Oct 27 2020

Ho un pacchetto Python package_nameche fornisce un'applicazione a riga di comando command-line-app-namecome console_script:

setup.py:

setup(
    ...
    entry_points={"console_scripts": ["command-line-app-name=package_name.cli:main"]},
    ...
)

Il virtualenv si trova in <project>/.venve gestito con pipenv. pipenvi venv gestiti dovrebbero supportare l'integrazione di debug di VSCode. Ho creato un launch.jsonfile di configurazione del debugger con l'impostazione del percorso Python su venv ( pythonPath):

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: command-line-app-name",
            "type": "python",
            "request": "launch",
            "stopOnEntry": false,
            "program": "command-line-app-name",
            "linux": {
                "pythonPath": "${workspaceFolder}/.venv/bin/python", "args": ["-r", "/home/florian/gitlab/package_name/data/Test_MRM.d"] }, "windows": { "pythonPath": "${workspaceFolder}/.venv/Scripts/python.exe",
                "args": ["-r", "D:\\MassHunter\\Data\\demo_0000.d"],
            },
            "console": "integratedTerminal"
        }
    ]
}

L'eseguibile python venv specifico per Windows e Linux e gli argomenti della riga di comando non dovrebbero avere alcun impatto. Se corro il debugger ottengo: FileNotFoundError: [Errno 2] No such file or directory: '/home/florian/gitlab/package-name/command-line-app-name'. Sembra che io stia interpretando male la documentazione in qualche modo. Ho provato a trovare aiuto per vscode-python e debugpy senza successo. Come posso eseguire il debug di un'app della riga di comando dello script della console (invece di un modulo del pacchetto)?

Risposte

thinwybk Oct 27 2020 at 16:24

console_scriptsnon può essere eseguito il debug out-of-the-box. La soluzione è chiamare direttamente la funzione del punto di ingresso invece ( "program": "${workspaceRoot}/package_name/cli.py",). Ciò richiede di aggiungere l' if __name__ == '__main__':idioma nel modulo corrispondente (qui :) cli.py. Nel mio caso il parser degli argomenti della riga di comando utilizzato è click. Tuttavia lo pseudo-codice dovrebbe essere molto simile per altre librerie di parser da riga di comando.

package_name/cli.py:

@click.command()
@click.option(...)
def main(<args>, <kwargs>):
    ...


if __name__ == '__main__':
    main()  # pylint: disable=no-value-for-parameter

.vscode/launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: command-line-app-name",
            "type": "python",
            "request": "launch",
            "stopOnEntry": false,
            "program": "${workspaceRoot}/package_name/cli.py",
            "linux": {
                "pythonPath": "${workspaceFolder}/.venv/bin/python", "args": ["-r", "/home/florian/gitlab/package_name/data/Test_MRM.d"] }, "windows": { "pythonPath": "${workspaceFolder}/.venv/Scripts/python.exe",
                "args": ["-r", "D:\\MassHunter\\Data\\demo_0000.d"],
            },
            "console": "integratedTerminal"
        }
    ]
}

NOTA : lo strumento utilizzato per gestire il venv fa la differenza. Questa soluzione funziona nel caso in cui venv sia gestito con pipenv. La soluzione non funziona nel caso in cui venv sia gestito con poetry.