Jak mogę debugować aplikacje wiersza poleceń w języku Python console_script za pomocą debugera VSCode?
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
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.