[Mac] Python3 버전 선택하기

John Yoon·2023년 1월 25일


최근 개인 프로젝트를 하면서 GPU 가속를 사용하기 위해 Numba 를 패키지를 사용하게 됐다.

하지만 내가 지금 사용하는 파이썬은 3.11.1 버전인데... 파이썬 3.11 은 아직 지원하지 않는단다
Numba 0.57.x 가 출시될때까진 일단 파이썬 3.10 을 써야 할거 같다 싶어 황급히 파이썬 공식 홈페이지에 가서 파이썬 3.10.9 버전을 설치해 주었다.

설치를 완료하고 python3 를 실행시켜보자.
"난 분명 3.10.9 버전을 방금 설치했는데 python3 은 아직도 3.11.1 를 실행시킨다..."

심지어 pip3 도 3.11.1 파이썬 인터프리터를 여전히 사용하고 있는 상황...

사실 python3.10 명령어를 사용하면 곧바로 3.10 버전이 사용되겠지만, 내가 프로젝트를 위해 짜놓은 쉘 스크립트는 로컬 컴퓨터에 설치 되있는 python3 명령어를 기준으로 작동하므로 python3 가 3.10.9 버전을 실행하도록 바꿔놓아야 한다.

(`python3` 과 `pip3` 를 쳤을때, 위의 `python3.10` 과 `pip3.10` 명령어가 돌아가게 만들어야 한다...)

그래서 일단 which 명령어를 사용해 해당 프로그램이 대체 어디서 실행되는건지 찾아보았다.
그리고 $PATH 환경변수를 프린트해서 환경변수 순서가 설정되있는건지 살펴보자

역시나.. 환경변수 맨 앞에 파이썬 3.11 바이너리 폴더(bin) 가 설정돼있다. 그리고 뒤에 딸려오는 과거에 설치한 3.9, 3.8 버전도 딸려오는 상황...
그래서 일단 저 환경변수가 설정되는 ~/.zprofile 파일을 파해쳐보았다

그랬더니 역시나 여기에 전부 설정 되있는 모습이다... 사실 여기서 저기 나오는 저 형식이랑 똑같이 파이썬 3.10 버전도 만들어서 24번줄 아래에 붙여주면 된다. 하지만 뭔가 파이썬을 설치할때마다 환경변수가 저렇게 쌓이면 지저분할거 같아서 전부 주석처리해버리자!!

이제 저장하고 새로운 터미널을 실행시켜주면...?

한결 깔끔띠 해진 모습이다. 이제는 파이썬3 이랑 pip3 가 어디로 연결되는지 다시 확인해보자..!

역시 예상대로 파이썬 기본 설치 위치인 /usr/local/bin 으로 돌아간다! (참고로 /usr/bin 경로에 있는 파이썬은 맥이 구동하기 위해 설치된 파이썬이다, 이건 건들이지 않도록 조심하자...)

여튼 이제 파이썬을 실행 시켜보자!!

하지만 여전히 3.11.1 로 돌아가지는 상황... 한번 /usr/local/bin 에 있는 파이썬을 확인해보자.

ls -al /usr/local/bin | egrep "(pip3|python3) ->" 를 실행하면 해당 폴더의 pip3 와 python3 의 symbolic link 들만 표시하게 된다. 그리고 역시나 3.11 이 돌아가게 연결되있는 상황.

이걸 이제 ln 명령어를 사용해 우리가 원하는 3.10 으로 바꿔주면

(ln -sf <실행시킬파일> <링크파일> 를 사용하면 기존의 링크파일에 연결된 symbolic link 를 <실행시킬파일> 로 강제 덮어씌우기 한다)

짜잔..! 이제 python3 와 pip3 가 3.10 버전으로 링크된 모습이다.

python3 --versionpip3 --version 을 쳐서 확인해보면 3.10 이 성공적으로 실행되는 모습이다.

여기까지, 파이썬3 랑 pip3 기본 명령어 실행 버전 바꾸는 방법이였다

근데 어차피 Numba 가 3.11 까지 지원하기 시작하면 다시 3.11 버전으로 올려야 할텐데... 할것도 없고 심심하니 스크립트나 작성하면서 놀아보자.
(이 아래부턴 그냥 노는거다, 안따라해도 된다)

일단 내가 원하는건 명령어 하나만 딱 입력하면 기본 파이썬 실행 버전이 바뀌는거다.
명령어는 음... "Python Change Version" 에서 따와서 "pycv" 로 하자ㅋㅋ

빠르게 스크립트를 작성하고...

전체 스크립트를 보려면 여기를 눌러서 확인해보자
#!/usr/bin/env bash

# Find current python3 and pip3 version
CURRENT_PYTHON="$(basename $(readlink /usr/local/bin/python3))"
CURRENT_PIP="$(basename $(readlink /usr/local/bin/pip3))"

echo -e "Current Python : ${CURRENT_PYTHON}"
echo -e "Current PIP    : ${CURRENT_PIP}"

# List all available python3
echo -e "Available python3 versions:"
ls -a /usr/local/bin | egrep "^(python3)\.[0-9]+$" | sed 's/^/    /'

# User prompt to select python version
echo -en "Enter new default python3 version: "
read PYTHON_VERSION

# Strip 'python' prefix away (if exist)
PYTHON_VERSION="$(echo ${PYTHON_VERSION} | sed 's/^python//')"

# Confirm if such version exist
ls -a /usr/local/bin | egrep "^python${PYTHON_VERSION}$" 1> /dev/null 2> /dev/null

if [ ${?} -ne 0 ]; then
	echo -e "Such python version is not installed or exist"
	return 1 2> /dev/null; exit 1
fi

# Change the symbolic link
ln -sf /usr/local/bin/python${PYTHON_VERSION} /usr/local/bin/python3

# Check if change was successful
if [ ${?} -ne 0 ]; then
	echo -e "Something went wrong, linking failed."
	return 1 2> /dev/null; exit 1
else
	echo -e "Successfully changed default python3 interpreter to python${PYTHON_VERSION}"
fi

# List all available pip versions
echo -e "Available pip3 versions:"
ls -a /usr/local/bin | egrep "^(pip3)\.[0-9]+$" | sed 's/^/    /'

# Confirm is pip3 with same version as python3 exist
ls -a /usr/local/bin | egrep "^pip${PYTHON_VERSION}$" 1> /dev/null 2> /dev/null

# Prompt user to select pip3 version
if [ ${?} -eq 0 ]; then
	PIP_VERSION_EXIST="true"
	echo -e "Corresponding pip3 version is found (pip${PYTHON_VERSION})"
	echo -e "If you like to use this pip${PYTHON_VERSION}, hit ENTER."
	echo -en "Otherwise, enter new default pip3 version: "
	read -r PIP_VERSION 

	# If user hit ENTER, make pip3 version to match python3 version
	if [[ ${PIP_VERSION} = "" ]]; then
		PIP_VERSION=${PYTHON_VERSION}
	fi
else
	PIP_VERSION_EXIST="false"
	echo -en "Enter new default pip3 version: "
	read PIP_VERSION
fi

# Confirm if such version exist
ls -a /usr/local/bin | egrep "^pip${PIP_VERSION}$" 1> /dev/null 2> /dev/null

if [ ${?} -ne 0 ]; then
    echo -e "Such pip version is not installed or exist"
    return 1 2> /dev/null; exit 1
fi

# Change the symbolic link
ln -sf /usr/local/bin/pip${PIP_VERSION} /usr/local/bin/pip3

# Check if change was successful
if [ ${?} -ne 0 ]; then
    echo -e "Something went wrong, linking failed."
    return 1 2> /dev/null; exit 1
else
    echo -e "Successfully changed default pip3 interpreter to pip${PIP_VERSION}"
fi

# Return 0
return 0 2> /dev/null; exit 0

chmod 를 통해 실행가능 파일로 만들어주고,

실행시켜주면?

짜잔..! 이렇게 컴퓨터에 설치되있는 파이썬 리스트를 보여주고 python3 로 선택할 버전을 입력하라고 한다.
우린 다시 한번 3.11 버전으로 바꿔보자. (python3.11 이라고 쳐도 되고 3.11 만 쳐도 된다!)

이렇게 성공적으로 python3 의 버전이 바뀌면 이젠 pip3 의 버전을 선택해야 한다. 지금같은 경우, 파이썬 3.11 을 선택했을때 pip 3.11 버전도 존재한다면 그걸 사용하길 추천하다. 굳이 다른 버전을 선택해도 되지만, 파이썬의 버전과 pip3 의 버전은 서로 매치시키는게 좋으므로 그냥 엔터를 누른다!

그럼 이렇게 pip3 의 설정도 마쳤다면서 알림이 뜨고 프로그램이 종료된다
실제로 바꼈나 한번 확인해보면~

역시 우리가 원하는 버전의 파이썬이 실행 되는걸 볼 수 있다!

자 이제 이 실행파일을 우리가 어디에서든 실행시킬수 있도록 환경변수 설정을 해주자.

우선 홈 디렉토리에 실행파일을 담아놓는 폴더의 네이밍 관례를 따라서 bin 이라는 폴더를 만들어주고 내 pycv 스크립트를 그 위치로 옮겨줬다.

이제 ~/.zprofile 에서 이 폴더를 환경변수에 추가해주자.

이렇게 $PATH 에 우리 프로그램 위치를 추가해주고 다시 쉘을 껏다 켜보면?

이렇게 아무 위치에서나 pycv 를 실행시킬수 있는것을 볼 수 있다...! (겸사겸사 다시 3.10 버전으로 바꿔놓기~)

끝!

1개의 댓글

comment-user-thumbnail
2023년 1월 25일

아 스크립트 코드 부분은 길어질까봐 details 태그로 감싸서 드랍다운형식으로 만들었는데... 포스팅 하니까 사라져버렸네.. 분명 프리뷰에선 작동했었는데 ㅜ

답글 달기