Bagaimana cara men-debug aplikasi baris perintah console_script Python dengan debugger VSCode?

Oct 27 2020

Saya memiliki paket Python package_nameyang menyediakan aplikasi baris perintah command-line-app-namesebagai console_script:

setup.py:

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

Virtualenv terletak <project>/.venvdan dikelola dengan pipenv. pipenvvenv yang dikelola harus mendukung integrasi debugging VSCode. Saya telah membuat launch.jsonfile konfigurasi debugger dengan mengatur jalur Python ke 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"
        }
    ]
}

Argumen venv python yang dapat dieksekusi dan argumen baris perintah khusus Windows dan Linux seharusnya tidak berdampak. Jika saya menjalankan debugger saya mendapatkan: FileNotFoundError: [Errno 2] No such file or directory: '/home/florian/gitlab/package-name/command-line-app-name'. Sepertinya saya salah menafsirkan dokumentasi. Saya mencoba mencari bantuan wrt vscode-python serta debugpy tanpa hasil. Bagaimana cara men-debug aplikasi baris perintah skrip konsol (bukan modul paket)?

Jawaban

thinwybk Oct 27 2020 at 16:24

console_scriptstidak dapat di-debug secara out-of-the-box. Solusinya adalah memanggil fungsi titik masuk secara langsung sebagai gantinya ( "program": "${workspaceRoot}/package_name/cli.py",). Ini perlu menambahkan if __name__ == '__main__':idiom dalam modul yang sesuai (di sini cli.py:). Dalam kasus saya, parser argumen baris perintah yang digunakan adalah click. Namun pseudo-code harus sangat mirip dengan lib parser baris perintah lainnya.

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

CATATAN : Alat yang digunakan untuk mengelola venv membuat perbedaan. Solusi ini berhasil jika venv dikelola dengan pipenv. Solusinya tidak berfungsi jika venv dikelola dengan poetry.