Backend/Python

pyenv는 어떤 방식으로 파이썬 버전을 관리할까

sangwonYoon 2023. 12. 28. 20:46

python 또는 pip 명령어가 실행 파일을 찾는 방법

python 또는 pip 명령어를 실행할 때, 운영 체제가 해당 명령의 실행 파일을 찾기 위해 환경변수 PATH의 값을 참조한다.

/usr/local/bin:/usr/bin:/bin

환경변수 PATH는 콜론(:)으로 각 디렉토리 경로를 구분한다. 실행 파일을 찾기 위해 가장 왼쪽에 존재하는 디렉토리 경로부터 명령어에 대응하는 실행파일이 있는지 확인한다.

이 경우에는 /usr/local/bin 디렉토리에서 실행 파일을 찾고, /usr/bin, /bin 디렉토리 순서로 해당하는 실행 파일을 발견할 때까지 탐색한다.

 

shim을 통한 명령어 가로채기

pyenv는 환경변수 PATH에 shims 디렉토리를 가장 왼쪽에 추가한다.

$(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin

shim은 명령어를 pyenv에 전달하는 역할을 하는 실행 파일이다.

pyenv를 설치한 후, 예를 들어 pip 명령어를 실행하면 운영 체제는 다음과 같이 동작한다.

  1. 환경변수 PATH를 참조하여 pip 이름을 가진 실행 파일을 검색한다.
  2. 환경변수 PATH의 첫번째 디렉토리 경로($(pyenv root)/shims)에서 pip 이름을 가진 shim을 찾는다.
  3. pip 이름을 가진 shim이 실행되면 pyenv에 명령이 전달된다.

 

파이썬 버전 선택

shim이 실행되면 pyenv는 어떤 파이썬 버전을 사용할지 아래의 순서에 의해 판단한다.

  1. 환경변수 PYENV_VERSION의 값을 읽는다(존재하는 경우).
  2. pyenv shell 명령어를 통해 현재 쉘 세션의 환경변수 PYENV_VERSION의 값을 설정할 수 있다.
  3. 현재 디렉토리의 .python-version 파일을 읽는다(존재하는 경우).
  4. pyenv local 명령어를 통해 현재 디렉토리의 .python-version 파일의 내용을 수정할 수 있다.
  5. 파일 시스템의 root에 도달할 때까지 부모 디렉토리의 .python-version 파일을 찾아 올라간다.
  6. $(pyenv root)/version 파일을 읽는다.
  7. pyenv global 명령어를 통해 $(pyenv root)/version 파일을 수정할 수 있다.
  8. “system” 파이썬을 사용한다.
  9. pyenv versions 명령어를 사용하면 확인할 수 있는 특수한 버전 이름인 “system”은 환경변수 PATH에서 shims 디렉토리 뒤에 정의된 디렉토리에 존재하는 파이썬 실행 파일이다. 즉, pyenv를 통해 설치한 파이썬이 아닌 Mac OS에 기본으로 설치되어 있는 파이썬과 같은 것을 의미한다.

 

실행 파일 선택

최종적으로 pyenv가 어떤 파이썬 버전을 사용할지 결정되면, 해당 버전의 파이썬이 설치된 경로 하위에서 명령어에 대응하는 실행 파일을 찾아 실행한다.

각 파이썬 버전들은 $(pyenv root)/versions 디렉토리 밑에 설치되어 있다.

따라서 만약 pyenv가 파이썬 3.4.2 버전을 사용한다면 $(pyenv root)/versions/3.4.2/ 디렉토리 하위에서 실행 파일을 검색하여 실행할 것이다.