Jak mogę debugować aplikacje wiersza poleceń w języku Python console_script za pomocą debugera VSCode?

Oct 27 2020

Mam pakiet Pythona, package_namektóry udostępnia aplikację wiersza poleceń command-line-app-namejako console_script:

setup.py:

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

Virtualenv znajduje się w <project>/.venvi jest zarządzany za pomocą pipenv. pipenvmanaged venvs powinno obsługiwać integrację debugowania VSCode. Utworzyłem launch.jsonplik konfiguracyjny debuggera z ustawieniem ścieżki Pythona do 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"
        }
    ]
}

Specyficzne dla systemów Windows i Linux plik wykonywalny venv python i argumenty wiersza poleceń nie powinny mieć wpływu. Jeśli uruchomić debugger uzyskać: FileNotFoundError: [Errno 2] No such file or directory: '/home/florian/gitlab/package-name/command-line-app-name'. Wygląda na to, że jakoś nie interpretuję dokumentacji. Bez powodzenia próbowałem znaleźć pomoc dla programu vscode-python, a także debugować . Jak mogę debugować aplikację wiersza poleceń skryptu konsoli (zamiast modułu pakietu)?

Odpowiedzi

thinwybk Oct 27 2020 at 16:24

console_scriptsnie można debugować po wyjęciu z pudełka. Rozwiązaniem jest bezpośrednie wywołanie funkcji punktu wejścia ( "program": "${workspaceRoot}/package_name/cli.py",). Wymaga to dodania if __name__ == '__main__':idiomu w odpowiednim module (tutaj cli.py:). W moim przypadku parser argumentów wiersza poleceń to click. Jednak pseudokod powinien być bardzo podobny dla innych bibliotek parsera wiersza poleceń.

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"
        }
    ]
}

UWAGA : Narzędzie używane do zarządzania wenv ma znaczenie. To rozwiązanie działa w przypadku zarządzania venv pipenv. Rozwiązanie nie działa w przypadku zarządzania wenv poetry.