가상 환경(Virtual Environment)은 Python 프로젝트에서 독립적인 의존성 관리를 가능하게 해주는 도구이다. Python 프로젝트를 관리하는 데 있어 중요한 개념이며, 프로젝트별로 서로 다른 라이브러리 및 패키지 버전을 사용할 수 있게 한다. 이는 특히 여러 프로젝트가 동시에 진행될 때 충돌을 방지하고, 환경을 깨끗하게 유지하는 데 중요한 역할을 한다.

시스템 전역 Python 설치의 문제점

Ubuntu와 같은 시스템에서 기본적으로 Python이 설치되어 있지만, 프로젝트가 여러 개일 때 전역적으로 패키지를 설치하는 방식은 여러 문제를 야기할 수 있다. 대표적으로 다음과 같은 문제들이 발생한다.

이러한 문제들을 해결하기 위해 가상 환경이 등장했으며, 이를 통해 프로젝트별로 독립적인 Python 환경을 생성할 수 있다.

가상 환경의 정의

가상 환경은 특정 Python 프로젝트를 위한 격리된 환경이다. 격리된 환경에서는 다음과 같은 작업을 할 수 있다.

가상 환경의 개념을 수식으로 표현하면, 가상 환경에서 관리하는 패키지들의 집합 \mathbf{P}_{\text{env}}는 시스템 전역 패키지 집합 \mathbf{P}_{\text{global}}과는 독립적이다. 즉,

\mathbf{P}_{\text{env}} \cap \mathbf{P}_{\text{global}} = \varnothing

위 수식은 가상 환경 내에서 설치된 패키지와 시스템 전역으로 설치된 패키지가 서로 충돌하지 않음을 의미한다.

가상 환경의 필요성

  1. 프로젝트별 의존성 관리: 각 프로젝트는 고유한 요구 사항을 가지고 있다. 예를 들어, 프로젝트 A는 numpy 패키지의 1.18 버전을 요구하고, 프로젝트 B는 numpy 1.20 버전을 요구할 수 있다. 가상 환경을 사용하면 두 프로젝트가 독립적인 패키지 버전을 유지할 수 있다.

  2. 파이썬 버전 관리: Python은 지속적으로 업데이트되며, 각 버전은 새로운 기능을 추가하거나 이전 기능을 제거할 수 있다. 예를 들어, 한 프로젝트는 Python 3.8에서 작성되었고, 다른 프로젝트는 Python 3.10이 필요할 수 있다. 가상 환경을 통해 프로젝트별로 필요한 Python 버전을 독립적으로 설정할 수 있다.

가상 환경을 사용하지 않을 경우 발생할 수 있는 문제

가상 환경을 사용하지 않고 여러 프로젝트를 관리할 경우, 다음과 같은 문제들이 발생할 수 있다.

가상 환경의 구조

가상 환경은 기본적으로 Python 인터프리터와 패키지 의존성을 포함한다. 가상 환경의 구조를 수식으로 표현하면 다음과 같다.

\text{Venv} = (\mathbf{Python\ Interpreter}, \mathbf{Packages}, \mathbf{Scripts})

이러한 구조는 프로젝트 간 독립성을 보장하며, 각 프로젝트의 요구 사항에 맞게 유연하게 설정할 수 있다.

가상 환경의 생성 및 관리

Ubuntu에서 가상 환경을 생성하고 관리하는 방법은 매우 간단한다. 가장 널리 사용되는 도구 중 하나는 venv이다. 이는 Python 3.3부터 기본 제공되며, Ubuntu 환경에서는 다음과 같은 명령어로 가상 환경을 생성할 수 있다.

python3 -m venv myenv

위 명령어는 myenv라는 이름의 가상 환경을 생성한다. 해당 디렉터리 안에는 Python 인터프리터, 패키지 및 가상 환경 관리 스크립트들이 포함된다.

가상 환경을 활성화하려면 다음 명령을 사용한다.

source myenv/bin/activate

이제 터미널 프롬프트가 (myenv)로 변경되며, 이는 현재 가상 환경이 활성화된 상태임을 의미한다. 가상 환경 내에서는 시스템 전역으로 설치된 패키지가 아니라, 가상 환경 내에서만 설치된 패키지를 사용하게 된다.

가상 환경에서의 패키지 설치

가상 환경이 활성화된 상태에서는 일반적인 방식으로 패키지를 설치할 수 있다. 예를 들어 requests 라이브러리를 설치하려면 다음과 같은 명령을 실행한다.

pip install requests

이때 설치된 패키지들은 가상 환경 내의 전용 site-packages 디렉터리에 저장된다. 이러한 방식으로 각 프로젝트는 자신만의 독립된 패키지 환경을 갖게 된다.

가상 환경의 비활성화

가상 환경을 비활성화하려면 간단히 다음 명령어를 입력한다.

deactivate

이 명령어를 입력하면 가상 환경이 종료되고, 다시 시스템 전역 Python 환경으로 전환된다. 이때 설치된 패키지들은 전역적으로 설치된 패키지들이 아닌, 가상 환경에만 영향을 미쳤음을 알 수 있다.

가상 환경을 사용한 버전 호환성 관리

가상 환경의 또 다른 주요 이점은 Python 버전 간 호환성을 관리할 수 있다는 점이다. 예를 들어, 특정 프로젝트는 Python 3.8 버전을 사용해야 하고, 다른 프로젝트는 Python 3.10 버전을 요구할 수 있다. 이 경우 가상 환경을 통해 각 프로젝트에서 필요한 Python 버전을 쉽게 관리할 수 있다.

다음 명령어로 특정 Python 버전을 사용하여 가상 환경을 생성할 수 있다.

python3.8 -m venv myenv

위 명령어는 Python 3.8을 기반으로 하는 가상 환경을 생성한다. 이를 통해 프로젝트 간에 Python 버전이 다르더라도 독립적으로 관리가 가능한다.

의존성 격리의 원리

가상 환경에서 각 프로젝트의 의존성을 격리하는 원리는 간단한다. Python 인터프리터는 기본적으로 전역 패키지 경로를 참조하지만, 가상 환경이 활성화되면 전역 패키지 경로가 아닌, 가상 환경 내부의 site-packages 디렉터리만을 참조하게 된다. 이는 Python의 sys.path가 변경되기 때문이다.

이를 수식으로 표현하면, Python의 패키지 탐색 경로는 기본적으로 \mathbf{sys.path_{global}}이지만, 가상 환경이 활성화된 상태에서는 \mathbf{sys.path_{venv}}를 참조한다.

\mathbf{sys.path_{global}} \neq \mathbf{sys.path_{venv}}

따라서, 가상 환경이 활성화된 동안에는 전역적으로 설치된 패키지와 무관하게 독립된 패키지 관리가 가능한다.

가상 환경 사용 시 유의할 점

가상 환경을 사용할 때 몇 가지 주의해야 할 사항들이 있다.

다양한 가상 환경 도구들

venv 외에도 여러 가상 환경 관리 도구들이 존재하며, 프로젝트에 따라 적절한 도구를 선택할 수 있다.

각 도구는 사용자의 필요에 맞게 가상 환경을 생성하고 관리할 수 있는 다양한 옵션을 제공한다.