Wie kann ich Python console_script-Befehlszeilen-Apps mit dem VSCode-Debugger debuggen?

Oct 27 2020

Ich habe ein Python - Paket , package_namedas eine Kommandozeilen - Anwendung bietet command-line-app-namewie console_script:

setup.py::

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

Die virtuelle Umgebung befindet sich in <project>/.venvund wird mit verwaltet pipenv. pipenvManaged Venvs sollten die VSCode-Debugging-Integration unterstützen. Ich habe eine Debugger-Konfigurationsdatei launch.jsonmit dem Python-Pfad zu venv ( pythonPath) erstellt:

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

Die Windows- und Linux-spezifischen Argumente für die ausführbare Datei venv python und die Befehlszeilenargumente sollten keine Auswirkungen haben. Wenn ich den Debugger starte, bekomme ich : FileNotFoundError: [Errno 2] No such file or directory: '/home/florian/gitlab/package-name/command-line-app-name'. Es scheint, als würde ich die Dokumentation irgendwie falsch interpretieren. Ich habe versucht, Hilfe für vscode-python sowie debugpy ohne Erfolg zu finden. Wie kann ich eine Konsolen-Skript-Befehlszeilen-App (anstelle eines Paketmoduls) debuggen?

Antworten

thinwybk Oct 27 2020 at 16:24

console_scriptskann nicht sofort debuggt werden. Die Lösung besteht darin, stattdessen die Einstiegspunktfunktion direkt aufzurufen ( "program": "${workspaceRoot}/package_name/cli.py",). Dazu muss das if __name__ == '__main__':Idiom im entsprechenden Modul hinzugefügt werden (hier :) cli.py. In meinem Fall wird der Befehlszeilenargument-Parser verwendet click. Der Pseudocode sollte jedoch für andere Befehlszeilen-Parser-Bibliotheken sehr ähnlich sein.

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

HINWEIS : Das zur Verwaltung des Venv verwendete Tool macht einen Unterschied. Diese Lösung funktioniert, wenn das Venv mit verwaltet wird pipenv. Die Lösung funktioniert nicht, wenn das Venv verwaltet wird poetry.