확인한 환경과 범위

Windows · Python 3.12.4. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.

이 글의 순서 4개 단락

패키지를 설치한 뒤에도 import가 실패한다면, 설치 명령과 실행 명령이 서로 다른 Python을 가리키는지 확인해 보세요. 가상환경은 각자 별도의 패키지 공간을 가지므로 한쪽에 설치한 패키지가 다른 쪽에 자동으로 나타나지는 않습니다.

먼저 환경 두 개를 비교하기

다음 예제는 실제 패키지를 설치하지 않고 상황만 단순하게 표현합니다. env_a에는 requests가 있고 env_b에는 없다고 가정합니다. 입력은 코드에 들어 있으며 별도의 파일이나 패키지가 필요 없습니다.

installed = {
    "env_a": {"requests"},
    "env_b": set(),
}

for environment in ("env_a", "env_b"):
    if "requests" in installed[environment]:
        print(f"{environment}: import 성공")
    else:
        print(f"{environment}: import 실패")

패키지를 설치했는데 VS Code에서 import가 실패하는 이유 — 첫 예제의 실제 실행 결과

예상 표준 출력:

env_a: import 성공
env_b: import 실패

이 코드는 실제 import를 수행하지 않는 모형입니다. 이제 실제 가상환경 두 개를 만들어 같은 차이를 확인합니다.

실제 가상환경에서 설치와 import 비교하기

실습 환경은 Python 3.12입니다. Python과 pip를 포함한 venv 기능이 설치되어 있어야 하며, requests를 설치하려면 패키지를 내려받을 수 있는 네트워크 연결이 필요합니다. VS Code 비교에는 Python 확장도 필요합니다. 아래 명령은 새 실습 폴더에서 실행하세요. env_a와 env_b가 이미 있으면 이전 설치가 결과에 영향을 줄 수 있으므로 이름이 겹치지 않는 새 폴더를 사용합니다.

Windows PowerShell에서는 다음을 실행합니다. py -3.12가 동작하지 않으면 Python 3.12 설치와 런처를 먼저 확인하세요.

py -3.12 -m venv env_a env_b
.\env_a\Scripts\python.exe -m pip install requests
.\env_a\Scripts\python.exe -m pip --version
.\env_b\Scripts\python.exe -m pip --version
.\env_a\Scripts\python.exe -c "import sys; print(sys.executable)"
.\env_b\Scripts\python.exe -c "import sys; print(sys.executable)"
.\env_a\Scripts\python.exe -c "import requests; print('import 성공')"
.\env_b\Scripts\python.exe -c "import requests; print('import 성공')"

macOS 또는 Linux에서는 Python 3.12가 python3.12로 실행된다는 전제 아래 다음을 사용합니다.

python3.12 -m venv env_a env_b
./env_a/bin/python -m pip install requests
./env_a/bin/python -m pip --version
./env_b/bin/python -m pip --version
./env_a/bin/python -c "import sys; print(sys.executable)"
./env_b/bin/python -c "import sys; print(sys.executable)"
./env_a/bin/python -c "import requests; print('import 성공')"
./env_b/bin/python -c "import requests; print('import 성공')"

설치가 성공하고 두 환경이 새로 만들어졌다면, 마지막 두 명령의 예상 결과는 다음과 같습니다. 두 번째 명령은 오류로 종료되며, 전체 traceback의 앞부분은 실행 환경에 따라 달라질 수 있습니다.

import 성공
ModuleNotFoundError: No module named 'requests'

pip --version은 각 환경의 pip 위치와 버전을 출력하고, sys.executable은 각 명령을 실행한 Python 실행 파일의 경로를 출력합니다. 절대 경로와 버전은 컴퓨터마다 다르므로 위 명령의 실제 출력을 서로 비교하세요. Windows에서는 각각 env_a\Scripts\python.exe와 env_b\Scripts\python.exe, macOS와 Linux에서는 각각 env_a/bin/python과 env_b/bin/python을 가리켜야 합니다.

env_a의 Python으로 -m pip install requests를 실행했으므로 설치 대상은 env_a입니다. env_b의 Python은 기본적으로 다른 가상환경의 패키지를 보지 못해 import에 실패합니다. python -m pip에서 python 자리에 환경의 실행 파일을 직접 지정하면 어떤 인터프리터의 pip를 사용하는지 분명해집니다. 위 명령은 활성화 없이 실행 파일을 직접 지정하므로 셸의 활성화 상태에 의존하지 않습니다.

VS Code에서 실행 인터프리터 맞추기

실습 폴더를 VS Code에서 열고 Python 확장을 설치한 다음, 명령 팔레트에서 Python: Select Interpreter를 실행합니다. 목록에서 env_a의 Python을 선택하세요. 목록에 보이지 않으면 환경 새로고침을 시도하거나 인터프리터 경로를 직접 지정합니다.

확인용 Python 파일에 다음 내용을 넣고 VS Code의 Python 실행 기능으로 실행합니다.

import sys

print(sys.executable)
import requests
print("import 성공")

첫 줄의 경로가 env_a의 실행 파일을 가리키고 그다음에 import 성공이 출력되면 설치 대상과 실행 인터프리터가 맞습니다. env_b를 선택하면 같은 파일에서 sys.executable 경로가 바뀌고 requests import가 실패합니다. sys.executable은 실행 파일 경로를 알려 주며, 드물게 경로를 알아낼 수 없는 환경에서는 빈 문자열이나 None일 수 있습니다.

이미 열려 있던 터미널이나 별도로 실행한 명령은 VS Code에서 방금 선택한 인터프리터와 다를 수 있습니다. 따라서 화면의 선택 표시만 보지 말고 실제 실행에서 출력된 sys.executable을 비교하세요. 디버그 설정에서 Python을 따로 지정한 경우에도 그 설정을 확인합니다.

흔한 실수와 작은 연습

  • pip install requests만 실행하면 현재 셸이 찾은 pip가 어느 Python에 속하는지 놓치기 쉽습니다. 실행할 Python을 명시해 그_Python -m pip install requests를 사용하세요.
  • ModuleNotFoundError가 항상 인터프리터 불일치 때문인 것은 아닙니다. 패키지 설치가 실패했거나, 설치 이름과 import 이름이 다르거나, 현재 폴더의 파일이 모듈 이름과 충돌할 수도 있습니다. 설치 명령의 오류와 실제 import 이름을 함께 확인하세요.
  • venv를 --system-site-packages로 만들거나 PYTHONPATH 등으로 검색 경로를 바꾼 환경은 이 실습과 결과가 다를 수 있습니다. 기본 설정으로 만든 새 환경에서 비교하세요.
  • 노트북에서는 편집기의 일반 Python 선택과 별도로 커널을 선택할 수 있습니다. 노트북 셀의 sys.executable로 실제 커널을 확인하세요.

연습: env_b를 그대로 사용하면서 requests를 성공적으로 import하려면 어떤 명령을 실행해야 할까요?

풀이: env_b의 Python으로 pip를 실행해 그 환경에 설치합니다. Windows PowerShell에서는 .\env_b\Scripts\python.exe -m pip install requests를, macOS와 Linux에서는 ./env_b/bin/python -m pip install requests를 실행합니다. 설치가 성공하면 위의 env_b import 명령을 다시 실행했을 때 import 성공이 출력될 것으로 예상합니다. VS Code에서도 env_b를 선택해 같은 결과를 확인할 수 있습니다.

CHECK THE SOURCE

참고한 공식 문서

기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.

한 줄씩 이해하고, 차곡차곡 기록합니다.이 글의 오류 제보하기 ↗