본문 바로가기
Python/Python 실전

[개발로그 Python] 가상환경 venv 사용해서 여러 형상 사용(intellij)

by 마이자몽 🌻♚ 2021. 6. 15.

가상환경은 왜 사용할까?

회사내에 Python을 이용한 프로젝트가 많습니다. 2. 대 버전을 사용하는 프로젝트도 있고 3. 대 버전을 사용하는 프로젝트도 있습니다. 만약 각 프로젝트가 개별적으로 서로 하나의 서버를 사용해서 서비스되고 있다면 설치된 Python 인터프리터 하나만 사용해도 되기 때문에 큰 문제가 없을 것 입니다. 그런데 만약 하나의 서버에 여러 프로젝트가 서비스되고 있고 설치된 Python 인터프리터만 사용하면 어떤 문제가 발생할까요?

 

3가지 프로젝트가 하나의 서버에서 운영되고 있는 경우... Project3의 경우 3.8 버전을 사용하는 프로젝트는 하나밖에 없기 때문에 현재의 시점에서는 문제가 없지만... Python 3.9 버전을 사용하는 Project1과 Project2의 경우 호환성 문제가 발생할 수 있습니다. Project1에서 먼저 Package C 1.5.5 버전을 설치하고 Project2가 개발되면서 Package C 2.2.1 버전으로 개발되었다고 가정하겠습니다. Project2가 서비스되면서 Package C를 1.5.5 --> 2.2.1 버전으로 업그레이드를 해버렸습니다. 이 때 Project1이 갑자기 문제가 생기고 정상작동하지 않을 수 있습니다. Package C가 업그레이드되면서 새로운 멤버가 추가되거나 삭제되어서 호환이 안되는 것 일 수도 있고... PackageA와 B에 Package C가 종속되어 요구하는 버전이 달라서 그럴 수도 있고... 이처럼 호환에 대한 문제가 발생했을 때 추적하기가 생각보다 어렵습니다.

 

 이런 문제를 해결하기 위해 가상환경을 사용해서 프로젝트별로 사용하는 인터프리터와 패키지의 공간을 분리할 수 있습니다.

 

 

가상환경 만들기

예제는 Mac, Linux에서 진행
# 가상환경을 사용할 프로젝트 디렉토리 생성
$ mkdir project1

# 가상환경 생성
$ python3.9 -m venv project1/.venv
# 가상환경 실행
$ source project1/.venv/bin/activate

# python3.9를 사용하는 것 확인
(.venv) $ python -V
Python 3.9.5

# 가상환경에서 패키지 설치
(.venv) $ pip install pytest
(.venv) $ pip show pytest
Name: pytest
Version: 6.2.4
Summary: pytest: simple powerful testing with Python
Home-page: https://docs.pytest.org/en/latest/
Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others
Author-email: None
License: MIT
Location: /Users/Jamong/workspace/project1/.venv/lib/python3.9/site-packages
Requires: packaging, attrs, pluggy, toml, iniconfig, py
Required-by: 

# 가상환경 빠져나가기
(.venv) $ deactivate

python2 버전에서는 virtualenv라는 외부 패키지를 사용해서 가상환경을 생성했는데... python 3.3부터는 venv모듈이 내장되어 있어 별도의 설치 없이 가상환경을 생성할 수 있습니다. 위 예제에서는 가상환경 python3.9 인터프리터와 venv 모듈을 이용해서 가상환경 생성하고 실행해서 pip를 이용해서 pytest 패키지를 설치 했습니다. pytest 6.2.4 버전은 해당 가상 환경에서만 사용할 수 있습니다.

 

$ pip3.9 show pytest
WARNING: Package(s) not found: pytest

가상 환경을 빠져나온 뒤에 초기에 설치된 python3.9와 연결된 pip를 통해 pytest가 설치되어 있는지 확인해보면... 없다는 경고를 확인할 수 있습니다. 이처럼 환경을 분리해서 사용하여 의존성, 호환성 문제를 해결할 수 있습니다.

 

 

가상환경으로 Python Script 실행은 어떻게 할까요?

가상환경을 왜 사용하고 어떻게 생성하는지 알아봤는데... 그럼 이 가상환경을 어떻게 이용할까요? 2가지 관점에서 보겠습니다. 첫번 째는 python 명령을 사용해서 실행하는 방법과 IDE 에디터에서 사용하는 방법 입니다.

 

가상환경으로 Python Script 실행

 

test.py

import pytest

 

$ python3.9 test.py 
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import pytest
ImportError: No module named pytest

python script를 실행할 때... python 명령어를 사용해서 실행했었는데... 이게 설치된 인터프리터를 사용하기 때문에 module이 없다는 오류가 발생합니다. script에서 가상환경의 python 인터프리터를 사용하려면 shebang을 사용하거나 가상환경의 인터프리터를 직접 사용해서 실행 하면 됩니다.

 

가상환경 인터프리터 직접 실행

$ /Users/Jamong/workspace/project1/.venv/bin/python test.py 

 

shebang 사용

test.py

#! /Users/Jamong/workspace/project1/.venv/bin/python
import pytest

 

$ chmod 755 test.py
$ ./test.py

 

Intellij 가상환경 사용

Intellij에서 Python을 비롯하여 Python의 가상환경을 사용하기 위해서 Plugin이 설치되어 있어야합니다.

 

위의 예제에서 가상환경을 생성한 프로젝트를 열어줍니다.

 

Project Structure를 열어줍니다.

 

SDKs 탭에서 Python SDK를 추가해줄겁니다.

 

IDE에서 가상환경을 새롭게 생성하고 프로젝트를 진행할 수도 있습니다. 해당 글에서는 위에서 생성한 가상환경이 있기 때문에 가상황경의 인터프리터를 지정해줍니다.

 

추가해주면 해당 SDK를 선택해주고 packages 탭을 클릭해보면 현재 설치되어 있는 패키지들을 확인할 수 있습니다. 이전에 설치한 pytest 모듈도 있는 것을 확인할 수 있습니다. "+" 모양 버튼을 클릭하면 IDE인터페이스에서 패키지들을 검색해서 설치할수도 있습니다.

 

IDE에서 검색해서 패키지를 설치할 수 있습니다.

 

Project 탭에서 추가한 SDK를 설정하고 적용해주면 완료입니다.

 

test.py

import pytest

IDE에서 실행시켜주면 이상없이 모듈을 받아오는 것을 확인할 수 있습니다.

 

 

정리

  • Python 가상환경은 각 프로젝트를 개별적으로 관리하여 패키지에 대한 호환성 문제를 해결하기 위해 사용된다.
  • Python 3.3 부터는 내장되어 있는 모듈 venv를 사용해서 가상환경을 생성할 수 있다.
  • Shebang을 이용하거나 가상환경의 인터프리터를 직접 사용해서 Python Script를 실행할 수 있다.
  • IDE에서도 플러그인을 사용해서 가상환경을 사용할 수 있다.

댓글0