Comment puis-je déboguer des applications de ligne de commande Python console_script avec le débogueur VSCode?
J'ai un package Python package_namequi fournit une application de ligne de commande command-line-app-namecomme console_script:
setup.py:
setup(
...
entry_points={"console_scripts": ["command-line-app-name=package_name.cli:main"]},
...
)
Le virtualenv est localisé <project>/.venvet géré avec pipenv. pipenvles venv gérés doivent prendre en charge l'intégration de débogage VSCode. J'ai créé un launch.jsonfichier de configuration du débogueur en définissant le chemin Python vers 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'exécutable venv python et les arguments de ligne de commande spécifiques à Windows et Linux ne devraient pas avoir d'impact. Si je lance le débogueur je reçois: FileNotFoundError: [Errno 2] No such file or directory: '/home/florian/gitlab/package-name/command-line-app-name'. Il semble que j'interprète mal la documentation. J'ai essayé de trouver de l'aide pour vscode-python ainsi que pour déboguer sans succès. Comment puis-je déboguer une application de ligne de commande de script de console (au lieu d'un module de package)?
Réponses
console_scriptsne peut pas être débogué prêt à l'emploi. La solution consiste à appeler la fonction de point d'entrée directement à la place ( "program": "${workspaceRoot}/package_name/cli.py",). Cela nécessite d'ajouter l' if __name__ == '__main__':idiome dans le module correspondant (ici:) cli.py. Dans mon cas, l'analyseur d'argument de ligne de commande utilisé est click. Cependant, le pseudo-code doit être très similaire pour les autres bibliothèques d'analyseurs de ligne de commande.
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"
}
]
}
REMARQUE : L'outil utilisé pour gérer le venv fait une différence. Cette solution fonctionne au cas où le venv est géré avec pipenv. La solution ne fonctionne pas au cas où le venv serait géré avec poetry.