macOS에서 가상환경이 꼬인 경우(feat. conda)

Gamchan Kang·2024년 4월 23일
0

Python

목록 보기
5/5
post-thumbnail

pip, python이 다른 인터프리터를 가리키는 경우

나는 vscode를 사용하고 있다.
vscode + 콘다 사용하면서 Solving environment: failed with initial frozen solve. Retrying with flexible solve. 만큼 자주 마주치는 에러가 있다.
환경 설정할 때 터미널에서 which pip, which python로 확인했을 때 터미널이 가리키는 인터프리터와 conda가 가리키는 인터프리터가 다른 경우이다.

Step 1. 가상 환경 해제

pyenv와 venv로 생성했던 인터프리터와 alias된 인터프리터로 환경이 꼬였다.
우선 가상환경을 해재해야 한다.

venv의 경우는 다음과 같이 가상환경을 종료할 수 있다.

deactivate

conda의 경우에는 다음과 같다.

conda deactivate

Step 2. PATH 확인

그럼에도 which pip, which python으로 확인한 pip와 python이 가리키는 인터프리터가 다를 경우가 있다. 이 경우에는 PATH 환경 변수를 확인할 필요가 있다.

echo $PATH

PATH 환경 변수에서 콜론(:)으로 구분된 순서 또한 중요하다. 만약 기본 파이썬 경로가 제일 앞서고 뒤에 conda 파이썬 경로가 출력된다면, 기본 파이썬이 항상 기본 값이 된다.

여기서 두가지 방법이 나뉜다.
1. 현재 실행 중인 쉘 세션에서만 conda 파이썬을 우선 참조하도록 할 것
2. 영구적으로 conda 파이썬 >> 기본 파이썬을 참조하도록 할 것

Step 3-1. 세션에서만 적용시키기

myenv라는 conda 가상환경이 있다고 가정한다.

기존에 있는 PATH 환경변수 앞에 conda 파이썬 경로를 추가한다.(macOS 기준)

export PATH="/opt/anaconda3/envs/{myenv}/bin:$PATH"

혹은 alias를 활용할 수도 있다.

alias python="/opt/anaconda3/envs/{myenv}/bin/python"
alias pip="/opt/anaconda3/envs/{myenv}/bin/pip"

이 두가지 방법은 다른 현재 터미널 세션에서만 적용되는 방법이다. 즉, 현재 터미널을 종료하거나 다른 터미널 창에서 실행하는 경우에는 적용되지 않는다.

Step 3-2. 영구 적용

macOS 기준 터미널 쉘 설정 파일은 다음과 같다.

bash의 경우

  • ~/.bash_profile 혹은 ~/.profile: 로그인 쉘에서 한 번 실행
  • ~/.bashrc: 비로그인, 대화형 세션(ex. 새 터미널 창)마다 실행

zsh의 경우

  • ~/.zprofile: ./profile과 유사한 동작
  • ~/.zshrc: 대화형 세션마다 실행

일반적으로 .bashrc는 .bash_profile 내부에서 로드된다.

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

위 코드는 .bash_profile 마지막에 추가해 .bash_profile이 .bashrc를 추적하도록 한다.
.bash_profile이 로그인 시 한 번만 실행되지만, .bashrc가 실행되면 .bash_profile이 실행된다.

.bash_profile의 전체 코드는 다음과 같다. 마찬가지로 .zshrc 또한 같은 코드로 적용할 수 있다.(다른 설정은 없다고 가정)

# Conda 초기화 코드를 .bash_profile에 추가
if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
    . "/opt/anaconda3/etc/profile.d/conda.sh"
fi

# Conda 환경이 활성화되면, 그 환경의 bin 디렉토리가 PATH의 가장 앞에 위치하도록 설정
__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/opt/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/opt/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup

.bash_profile의 경우 앞서 언급한 .bashrc 추적 코드까지 추가하면 적용이 됐다.
위 내용을 저장하고, 쉘 소스로 지정하면 끝난다.

# bash인 경우
source ~/.bash_profile
# zsh인 경우
source ~/.zshrc
profile
Someday, the dream will come true

0개의 댓글