파이썬은 다양한 라이브러리와 프레임워크를 제공하지만, 프로젝트마다 각 라이브러리 및 프레임워크에 대해 요구하는 환경 또는 버전이 다를 수 있습니다. 개인이 혼자 진행하거나 소규모 프로젝트라면 이렇게 다른 요구 환경에 대해 직접 대응이 가능할 수도 있지만, 협업이 필요하거나 공개된 대규모 프로젝트라면 개개인마다 환경이 달라 코드가 동작하지 않는 일이 발생합니다. 파이썬 venv 가상환경을 활용하면 이런 문제를 해결할 수 있기 때문에 스테이블 디퓨전과 같은 오픈소스 프로젝트에는 필수적인 도구로 활용되고 있습니다. 본 글에서는 venv, 파이썬의 기본 가상환경 도구에 대해 자세히 알아보겠습니다.
파이썬 가상환경 venv란
파이썬을 처음 설치하고 코드를 작성하다보면 외부 라이브러리를 추가해서 사용해야 하는 경우가 분명 발생합니다. 이때 라이브러리를 import 하면 보통 기본 설정된 가상환경(venv : virtual environment)에 설치되는데요, 도대체 이 가상환경이 무엇이며 왜 필요할까요?
위와 같이 본 코드를 작성하는데 패키지 3개(A,B,C)를 import해서 개발중인 경우를 생각해보겠습니다. 패키지 각각의 버전이 1.0, 2.3, 1.7인 상태로 열심히 개발해서 친구에게 코드를 공유해줬습니다.
친구는 내가 짠 코드를 실행하기 위해 똑같이 패키지를 설치해야 하는데요, 설치하려고 보니 이미 친구의 컴퓨터에는 패키지 A가 설치되어 있는데 버전이 2.0인 상황입니다. 친구는 당연히 더 최신 버전이니 나머지 B, C만 잘 설치하면 코드가 정상 실행될 것이라 생각했습니다.
하지만 현실은, 막상 code를 run 하지만 에러가 발생합니다. 에러 내용을 보니 패키지 B가 패키지A의 1.0버전에서 제공하는 함수들을 참조하는데, 패키지A가 2.0버전으로 업데이트되면서 1.0 버전에서 제공하던 함수들을 삭제(deprecate)하면서 실행이 되지 않는 것이었습니다.
그럼 친구는 이 오류를 해결하기 위해 패키지A의 버전을 의도적으로 1.0으로 낮춰야 할까요? 만약 이렇게 한다면 당장 이 코드는 실행이 되겠지만, 아무래도 패키지A를 필요로하는 다른 코드에서 또다른 오류가 발생할 수 있습니다.
여기서 알 수 있듯 우리가 개발하는 코드는 특정 환경에서 오류없이 동작합니다. 같은 패키지(라이브러리)라고 하더라도 프로젝트에 따라 요구하는 버전이 다를 수 있고 그에 따라 프로젝트가 실행이 되지 않을 수도 있습니다.
이런 문제를 잘 핸들링하기 위해 꼭 필요한 것이 바로 가상환경입니다. 개발하는 프로젝트마다 따로 가상환경을 설정해주고, 그 환경 속에 파이썬 버전, 필요한 패키지 버전들을 따로 설치하는 것입니다.
파이썬 가상환경 종류
앞서 살펴본 바와 같이 파이썬 가상환경은 파이썬 프로젝트 개발 시 각 프로젝트마다 독립된 환경을 제공하여 다른 프로젝트와 라이브러리의 충돌을 방지합니다. 대표적으로 사용되는 파이썬 가상환경에는 여러 종류가 있습니다.
- venv: Python 3.3 버전 이상에서 기본적으로 제공되는 가상환경 도구입니다.
venv
는 새로운 환경을 만들 때 Python 인터프리터의 복사본을 사용하며, 필요한 패키지를 로컬로 관리합니다. 간단한 명령어로 환경을 생성하고 활성화할 수 있습니다. - virtualenv:
venv
보다 오래전부터 사용되어 왔으며, Python 2.7 이상에서 사용할 수 있습니다.virtualenv
는 더 많은 기능과 유연성을 제공하지만, 최신 Python 버전에서는venv
의 사용이 권장됩니다.virtualenv
를 사용하면 다양한 Python 버전에 대한 환경을 쉽게 만들 수 있습니다. - conda: Anaconda와 Miniconda 배포판에 포함된 도구로, Python 가상환경 뿐만 아니라 패키지 관리 기능도 제공합니다. 데이터 과학과 기계 학습 분야에서 널리 사용되며, 특히 복잡한 과학 계산 패키지와 환경을 관리하는데 유용합니다.
- Pipenv:
pip
와virtualenv
의 기능을 결합한 도구로, 프로젝트별 종속성 관리에 편리합니다.Pipfile
과Pipfile.lock
을 사용하여 종속성을 명확하게 관리할 수 있습니다. - Poetry: 최근에 인기를 얻고 있는 도구로, 종속성 관리와 패키지 배포를 한 번에 처리할 수 있습니다.
pyproject.toml
파일을 사용하여 프로젝트 설정을 관리하며, 의존성 해결 알고리즘이 매우 견고합니다.
파이썬 가상환경 만드는 방법
그럼 가상환경은 어떻게 구축할 수 있을까요? 만약 파이참과 같은 IDE를 사용해 프로젝트를 만드셨다면 보통 프로젝트 생성 시점에 자동으로 가상환경 venv가 함께 생성됩니다. 아래는 파이참에서 새 프로젝트를 만들 때 가상환경 설정이 자동으로 되어있는 모습입니다. 프로젝트 폴더 아래에 venv 폴더가 생기면서 해당 위치를 가상환경으로 사용하겠다는 것입니다.
이렇게 venv를 구성하고 나면 아래 그림과 같이 실제 프로젝트 폴더 내에 venv 폴더가 추가로 생성됩니다.
더불어 프로젝트를 편집중인 상태에서 가상환경이 활성화 되어 있다면 터미널에 가상환경 폴더명(예시에서는 venv)이 표기됩니다.
터미널 상에서 명령어를 통해 가상환경에 진입하고 빠져나오는 것을 테스트 해볼 수 있습니다. 가상환경이 활성화 된 상태에서는 deactivate 명령어로 가상환경에서 빠져나올 수 있습니다. 이렇게 빠져나오면 경로 앞단에 (venv)가 사라진 것을 확인할 수 있습니다. 다시 venv를 활성화시키기 위해 위 이미지에서와 같이 venv/scripts/activate 명령어를 입력하면 가상환경에 다시 진입하는 것을 확인할 수 있습니다.
requirements.txt 설치
보통 github에서 다운받은 프로젝트들은 해당 프로젝트를 위해 실행에 필요한 라이브러리 정보를 담은 requirements.txt를 같이 제공합니다. 내려받은 프로젝트를 내 PC에서 정상적으로 실행하려면 이 requirments.txt에 기재된 패키지를 가상환경에서 설치해주면 되는데요, 메모장을 열고 하나씩 직접 입력해도 동작하는데는 문제가 없지만, 규모가 큰 프로젝트에서는 수작업으로 이를 하나씩 모두 설치하는 것은 매우 비효율적입니다. 이때는 터미널에서 다음 명령어를 입력하면 한번에 모든 라이브러리를 설치할 수 있습니다.
pip install -r requirements.txt
반대로 만약 내가 프로젝트를 배포하는 입장에서 requirements.txt를 같이 배포하고 싶다면, 텍스트 파일을 직접 만들 필요없이 터미널에 아래 명령어를 입력하면 프로젝트 폴더 내에 자동으로 requirements.txt 파일이 생성됩니다.
pip freeze > requirements.txt
깃허브에서 내려받아 설치하는 스테이블 디퓨전 WebUI 또는 ComfyUI 또한 해당 방식으로 가상환경을 구축하고 설치할 수 있습니다.