개인적으로 eclipse + pydev 환경을 가장 선호하지만 가벼운 환경으로 세팅하기 위해서는 vscode 에서 개발환경을 구축하는 것도 꽤 괜찮다고 생각한다. (회사에서는 아주 오래전 부터 eclipse + pydev 를 사용해서 flask 로 개발하고 있다. )

vscode 를 이용해서 파이썬 환경을 세팅할 때마다 순서를 잊어버려 블로그에 정리한다.
세팅하는 환경 기준은 windows 10, python3.7.4, vscode March 2020 (version 1.44) 이다.

virtualenv환경설정

  • cmd 로 콘솔창을 열고 가상 환경을 만들고 싶은 곳으로 이동한다.
cd C:\tools\python37_64\py_envs  
  • 파이썬 실행파일 fullpath 를 이용해 vtest 라는 가상환경을 생성한다.
C:\tools\python36_64\python.exe -m venv ./vtest  
  • 가상환경 실행
.\vtest\Scripts\activate.bat
  • pip 업데이트
python -m pip install --upgrade pip
  • pylint 설치
pip install pylint
  • pytest 설치
pip install pytest

 

VSCODE 설정

  • vscode 에서 필요한 확장 프로그램

  • settings.json 설정

    • python.pythonPath 경로대로 virtualenv 를 설정하기 위해서는 ctrl+shitf+P 를 누른 후, python select interprenter 를 선택한 후 해당 경로대로 python 을 선택하면 된다. python.pythonPath 를 넣지않고 하면 해당 경로 자체가 뜨지 않는다.
{
    // virtualenv 내 파이썬 경로
    "python.pythonPath": "C:\\tools\\python37_64\\py_envs\\vtest\\Scripts\\python.exe",

    // vurtalenv 경로
    "python.venvPath": "C:\\tools\\python37_64\\py_envs\\vtest",
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": true,


    // which 나 where 를 이용해서 실제 pylint 경로를 찾는다. 
    "python.linting.pylintPath": "C:\\tools\\python37_64\\py_envs\\vtest\\Scripts\\pylint.exe",

    // python code lint 옵션
    // 해당 경로를 .vscode 폴더내 파일로 잡는다.

    "python.linting.pylintArgs": [
    "--rcfile",
    "${workspaceRoot}\\.vscode\\pylint.config"
    ],
    // vscode testing 옵션
    "python.testing.pytestArgs": [
    ".","-s"
    ],

    "python.testing.pytestEnabled": true,
    "python.testing.unittestEnabled": false,
    "python.testing.nosetestsEnabled": false

    }

 

  • pylint.config
    • 위 파일에서 "python.linting.pylintArgs" 을 설정한 경로가 이 파일이다.
[MESSAGES CONTROL]
#C0111 Missing docstring
#C0103 Invalid constant name
#C0301 Line too long
#C0303 trailing whitespace
#C0325:Unnecessary parens after u'print' keyword
#W0621 : Redefining name 'something' from outer scope (line #)
#W0212 : Access to a protected member %s of a client class
#W0703 : Catching too general exception Exception
disable=C0111,C0103,C0303,C0301,C0325,W0621,W0212,W0703
  • launch.json
    • run 과 debug 할 때의 환경 설정
{
  // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
  // 기존 특성에 대한 설명을 보려면 가리킵니다.
  // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
  "version": "0.2.0",
  "configurations": [
      {
          "name": "Python",
          "type": "python",
          "request": "launch",
          "stopOnEntry": false,
          "pythonPath": "${config:python.pythonPath}",
          "program": "${file}",
          "cwd": "${workspaceRoot}",
          "env": {},
          "envFile": "${workspaceRoot}/.env",
      },
      {
          "name": "Integrated Terminal/Console",
          "type": "python",
          "request": "launch",
          "stopOnEntry": true,
          "pythonPath": "${config:python.pythonPath}",
          "program": "${file}",
          "cwd": "",
          "console": "integratedTerminal",
          "env": {},
          "envFile": "${workspaceRoot}/.env",
      },
  ]
}

 

샘플코드

  • main.py
def hello(world):
    # 아래 aa 변수 pylint 에러발생, Unused variable 'aa'pylint(unused-variable)
    aa = 1
    print("Hello " + world)

if __name__ == "__main__":
    hello("world")
    # 아래 줄에 빈 엔터가 없으면 Final newline missingpylint(missing-final-newline)

pylint 가 정상 동작한다면 물결표의 error, warning 표시가 발생해야 한다. 
정상적으로 launch.json 가 적용되면 디버깅 또는 실행탭에서 Python 으로 선택해서 실행하면 정상적으로 Hello world 가 출력된다. 

  • tests/test_main.py(pytest 용, 경로명과 파일이름과 method 명에 test 가 꼭 들어가야 한다. )
# clac/__init__.py 내용이 없기 파일만 존재
# calc/func.py

def add(a, b):
    return a+b
# tests/test_main.py

import sys
import os
myPath = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, myPath + '/../')

from clac.func import add

def test_add():
    assert add(1, 2) == 3

ctrl+shitf+P 를 누른 후 Python Debug All Test 선택 하면 테스트가 됨, 아니면 화면 하단 Run Tests 를 누른다.