Development/Environment

AWS Lightsail에서 파이썬 여러 버전 관리 및 사용 :: pyenv

고고마코드 2023. 8. 1. 14:32
반응형

pyenv

여러 버전의 Python을 사용하기 위해서 pyenv를 사용했습니다.
AWS Lightsail에서는 pyenv를 설치하기 위해서 사전에 설치해야 할 패키지가 있습니다.

먼저 설치해야 할 패키지

sudo yum install @development zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl11 openssl11-devel xz xz-devel libffi-devel findutils tk-devel -y

각 패키지가 필요한 이유

  • @development
    이 패키지 그룹은 일반적인 개발 도구 및 라이브러리(예: gcc, make 등)를 포함하고 있습니다. Python을 소스에서 빌드하려면 이러한 도구가 필요합니다.
  • zlib-devel
    zlib 라이브러리는 데이터 압축 및 압축 해제에 사용되는 소프트웨어 라이브러리입니다. Python은 gzip 및 zipfile 등의 모듈에서 zlib를 사용합니다.
  • bzip2, bzip2-devel
    bzip2는 또 다른 데이터 압축 알고리즘입니다. Python은 bz2 모듈에서 이를 사용합니다.
  • readline-devel
    readline 라이브러리는 사용자가 인터랙티브 쉘에서 텍스트 입력을 수정하고 관리할 수 있게 해주는 도구입니다. Python 인터프리터는 이 라이브러리를 사용하여 사용자 입력을 처리합니다.
  • sqlite and sqlite-devel
    SQLite는 파일 기반의 경량 데이터베이스 시스템입니다. Python은 sqlite3 모듈에서 이를 사용합니다.
  • openssl11, openssl11-devel
    OpenSSL은 보안 연결을 위한 암호화 라이브러리입니다. Python은 ssl 모듈에서 이를 사용합니다.
  • xz, xz-devel
    XZ는 파일 압축을 위한 도구입니다. Python은 lzma 모듈에서 이를 사용합니다.
  • libffi-devel
    libffi는 다양한 프로그래밍 언어 간에 호출을 수행하는 데 사용되는 포터블, 고수준 프로그래밍 인터페이스입니다. Python의 ctypes 모듈에서 사용됩니다.
  • findutils
    findutils 패키지에는 find와 xargs 등의 명령어가 포함되어 있습니다. 이 명령어들은 파일 시스템에서 파일을 검색하고, 파일에 대한 작업을 수행하는 데 사용됩니다. 이 패키지는 Python 빌드 프로세스 자체에서 필요로 하는 것일 수 있습니다.
  • tk-devel
    tkinter는 Python에서 GUI(Graphical User Interface) 애플리케이션을 만들기 위해 사용되는 표준 Python 인터페이스입니다. 이는 Tcl/Tk를 Python에 바인딩한 것입니다. Tcl(Tool Command Language)은 일반적인 프로그래밍 언어이며, Tk는 Tcl에서 사용하는 GUI 툴킷입니다.

pyenv 설치

curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

source ~/.bash_profile
  1. GitHub 저장소에서 최신 버전의 소스코드를 다운로드하고 컴파일합니다.
  2. 설치가 완료되면, .bashrc 파일에 pyenv 초기화 명령을 추가합니다.
  3. 터미널 세션에서 변경사항을 적용합니다.

pyenv의 주요 명령어가 궁금하다면 아래에 정리되어 있습니다.

사용 예시

제가 설치한 버전은 Python 3.10.7 버전입니다.

  1. Python 3.10.7 버전 설치
    pyenv install 3.10.7

  2. 설치된 버전 확인
    pyenv versions

  3. pyenv 버전 변경 후 확인
    pyenv global 3.10.7, pyenv versions

  4. Python 버전 확인
    python -V Python 3.10.7


pyenv 주요 명령어

  • pyenv install <version>
    예를 들어, Python 3.8.0을 설치하려면 pyenv install 3.8.0을 입력합니다.
  • pyenv versions
    현재 설치된 모든 Python 버전의 목록을 보여줍니다.
  • pyenv global <version>
    예를 들어, Python 3.8.0을 사용하려면 pyenv global 3.8.0을 입력합니다.
  • pyenv version
    현재 활성화된 Python 버전을 보여줍니다.
  • pyenv local <version>
    현재 디렉토리에 대한 Python 버전을 설정합니다. 디렉토리별로 Python 버전을 다르게 설정할 수 있습니다.
  • pyenv install --list
    이 명령어는 설치 가능한 모든 Python 버전의 목록을 보여줍니다.
  • pyenv uninstall <version>
    특정 Python 버전을 제거합니다. 예를 들어, Python 3.8.0을 삭제하려면 pyenv uninstall 3.8.0을 입력합니다.

설치 시 발생한 오류 정리

    import _ssl             # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl'
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Python 3.10.7 버전을 설치하려고 했는데 이 오류때문에 한참을 고생했습니다.
이 오류는 Python 설치 과정에서 OpenSSL 라이브러리를 찾지 못할 때 발생합니다. 이는 _ssl 모듈을 빌드할 때 OpenSSL이 필요하기 때문입니다.

첫 번째 시도 (실패)

이 방법은 OpenSSL 경로를 다시 한 번 확인하고, 환경 변수를 설정한 후 설치하는 방법입니다.

  1. OpenSSL 라이브러리 파일이 존재하는지 확인, OpenSSL 라이브러리는 올바르게 설치되어 있었습니다.
    ls /usr/lib64/libssl.so
    ls /usr/include/openssl/ssl.h
  2. Python 설치 과정에서 이 파일들을 찾지 못하는 것일 수도 있으므로 환경 변수 설정 후 설치 시도
    export LDFLAGS="-L/usr/lib64/"
    export CPPFLAGS="-I/usr/include/openssl/"
    pyenv install 3.10.7

결과는 같은 오류 발생하며 실패

두 번째 시도 (실패)

이 방법은 OpenSSL의 소스를 직접 다운로드하고 빌드하고 환경 변수 설정한 후 설치하는 방법입니다.

  1. 먼저, OpenSSL의 소스 코드를 다운로드 받습니다.
    wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
  2. 다운로드 받은 tar.gz 파일을 압축 해제합니다.
    tar xzvf openssl-1.1.1k.tar.gz
  3. 압축을 풀면 openssl-1.1.1k라는 디렉터리가 생성됩니다. 이 디렉터리로 이동해서 OpenSSL을 빌드합니다.
    cd openssl-1.1.1k
    ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
    make
    sudo make install
  4. 이제 OpenSSL이 /usr/local/openssl에 설치되었습니다. 이 경로를 환경 변수에 추가하면 Python 설치 과정에서 OpenSSL 라이브러리를 찾을 수 있게 됩니다.혹시 첫 번째 시도에 사용했었던 환경번수 경로가 남아있다면 그 경로는 지워야 합니다!
    echo 'export LDFLAGS="-L/usr/local/openssl/lib"' >> ~/.bashrc
    echo 'export CPPFLAGS="-I/usr/local/openssl/include"' >> ~/.bashrc
    echo 'export PKG_CONFIG_PATH="/usr/local/openssl/lib/pkgconfig"' >> ~/.bashrc
  5. 3.10.7 버전 설치 시도
    pyenv install 3.10.7

결과는 같은 오류 발생하며 실패


세 번째 시도 (성공)

이 방법은 OpenSSL의 버전을 변경한 후 설치하는 방법입니다.

  1. 우선 .bashrc 파일에 등록했던 환경변수를 제거합니다.
  2. 기존에 설치된 openssl-devel을 제거합니다.
    sudo yum remove openssl-devel
  3. openssl11, openssl11-devel 을 설치합니다.
    sudo yum install openssl11 openssl11-devel -y
  4. 3.10.7 버전 설치 시도
    pyenv install 3.10.7
  5. 파이썬 설치는 정상적으로 됐으나, ModuleNotFoundError: No module named '_tkinter' 라는 새로운 오류 발생
    해당 오류는 tk-devel 패키지 설치로 해결 sudo yum install tk-devel
반응형