VSCode + Pipenv로 Python Invoke 디버깅

TL;DR


pipenv run which invoke의 결과를 launch.jsonprogram로 지정

개요



빨리 CLI 도구를 만들 때 파이썬 + Invoke가 유용합니다.
Invoke를 설명하는 많은 기사가 있으므로이 기사에서는 생략합니다.
이 기사에서는 VSCode에서 Invoke를 사용하여 개발할 때 디버깅하는 방법을 설명합니다.

환경


  • 파이썬 3.7.3
  • Pipenv 2018.11.26_2
  • Invoke 1.2.0
  • Visual Studio Code 1.36.1

  • 코드는 Github에 있습니다.

    디버깅 대상 코드



    디버그 대상으로 피보나치 수의 계산 프로그램을 준비했습니다.num에서 받은 피보나치 수를 반환합니다.

    tasks.py
    #!/usr/bin/env python
    
    from invoke import task
    
    
    @task
    def fibonacci(c, num):
        n = int(num)
        if n < 0:
            print("[Error]: num must be natural number or 0.")
            exit(1)
    
        print(calculate_fibonacci(n))
    
    def calculate_fibonacci(num: int) -> int:
        if num < 0:
            raise ValueError("num must not be negative.")
    
        if num == 0:
            return 0
    
        if num == 1:
            return 1
    
        n_2 = 0 # fib[n-2]
        n_1 = 1 # fib[n-1]
        n = 1 # fib[n]
    
        for _ in range(1, num):
            n = n_2 + n_1
            n_2 = n_1
            n_1 = n
    
        return n
    
    

    또한 다음 명령으로 가상 환경을 만들고 invoke를 설치했습니다.
    $ cd path/to/project
    $ pipenv --python 3.7
    $ pip install invoke
    

    VSCode 설정



    가상 환경


    Pipfile가 있는 디렉토리에서 code .를 실행하면 VSCode가 자동으로 가상 환경을 인식합니다.



    디버깅



    Debug -> Configure or Fix launch.json에서 디버그 환경 설정을 엽니다.


    launch.json.configurations[]에 디버그 설정을 추가합니다.
    이번에는 invoke fibonacci --num 10를 디버그 실행하도록 설정합니다.
    invoke를 사용하는 프로그램은 tasks.pypython 명령으로 직접 시작하지 않고 invoke 명령으로 시작합니다.
    따라서 디버거에 지정하는 프로그램 파일은 tasks.py 대신 invoke 자체가 됩니다.
    invoke 명령 자체는 Python 프로그램입니다.invoke 자신은 가상 환경에서 관리되므로 다음 명령으로 검색합니다.
    $ pipenv run which invoke
    

    이 결과를 launch.jsonprogram로 지정하면 디버깅이 가능합니다.
    {
        "name": "Python: Debug invoke fibonacci --num 10",
        "type": "python",
        "request": "launch",
        "program": "path/to/invoke", // `pipenv run which invoke` の結果を挿入
        "console": "integratedTerminal",
        "args": ["fibonacci", "--num", "10"]
    }
    



    이제 Invoke를 사용하는 프로그램도 VSCode에서 디버깅할 수 있습니다.

    요약



    이번에는 Invoke를 사용한 프로그램을 VSCode로 디버깅하는 방법을 소개했습니다.
    Invoke 에 한정하지 않고 엔트리 포인트를 랩 하는 종의 라이브러리도 같은 방법으로 디버그 실행 가능하게 됩니다.

    좋은 웹페이지 즐겨찾기