파이썬 패키지 인식 - paisseon paekiji insig

패키지나 모듈은 호출을 하려는 파일과 동일한 경로에 있거나 또는 파이썬 라이브러리들이 모여 있는 폴더에 있어야 사용이 가능합니다. 앞에서 만든 theater 모듈이나 travel 패키지는 그들을 사용하는 practice.py 파일과 같은 위치에 있어서 문제 없이 사용할 수 있었던 것이죠.

파이썬에서는 사용하려는 모듈이 어느 경로에 있는지 확인할 수 있는 방법이 있습니다. 우리가 자주 쓰던 random 모듈에 대한 경로를 먼저 확인하기 위해 inspect 라는 모듈을 import 하고 getfile() 이라는 함수에 전달값으로 random 을 적습니다.

import inspect
import random
print(inspect.getfile(random)) # random 모듈의 위치

실행해보면 다음과 같이 random.py 파일이 존재하는 위치가 표시되네요. 처음에 환경설정을 진행하는 과정에서 파이썬을 설치할 때 지정한 경로 밑의 lib 폴더인 것을 확인할 수 있습니다.

C:\Python38\lib\random.py

이번에는 우리가 만든 travel 패키지의 thailand 모듈이 어느 경로에 위치하는지 확인해보기 위해 코드를 다음과 같이 작성합니다.

import inspect
from travel import *
print(inspect.getfile(thailand)) # thailand 모듈의 위치

실행해보니 thailand 모듈이 외부에서 호출된다는 문구와 함께 경로 정보가 표시되는데, 필자의 경우 바탕화면의 PythonWorkspace 폴더 내의 travel 폴더 밑에 thailand 모듈이 위치한다는 것을 알 수 있습니다.

Thailand 외부에서 모듈 호출
c:\Users\Nadocoding\Desktop\PythonWorkspace\travel\thailand.py

앞에서 패키지나 모듈은 "파이썬 라이브러리들이 모여 있는 폴더" 에 있으면 사용 가능하다고 했는데요. 확인을 위해 travel 패키지 폴더를 lib 폴더로 복사해보도록 하겠습니다. 폴더 복사를 위해서는 파일 탐색기를 직접 실행하여 작업 중인 폴더로 이동하셔도 되고, 또는 Visual Studio Code 에서 travel 폴더를 마우스 오른쪽 버튼으로 클릭하여 Reveal in File Explorer 메뉴를 선택하셔도 됩니다.

파이썬 패키지 인식 - paisseon paekiji insig

파일 탐색기에서 travel 폴더를 복사하고 random.py 파일이 존재하는 경로 (필자의 경우 C:\Python38\lib) 에 붙여넣기 하겠습니다.

파이썬 패키지 인식 - paisseon paekiji insig
작업 공간 내의 travel 폴더를 복사합니다
파이썬 패키지 인식 - paisseon paekiji insig
Python 설치 경로의 lib 폴더에 붙여넣기 합니다

그리고 현재 작업 공간 내의 travel 폴더는 임시로 travel_temp 로 이름을 변경하겠습니다. Visual Studio Code 에서 travel 폴더를 마우스 오른쪽 버튼 클릭하여 Rename 메뉴를 선택하면 이름 변경이 가능합니다.

파이썬 패키지 인식 - paisseon paekiji insig
travel 패키지의 이름을 travel_temp 로 변경합니다
파이썬 패키지 인식 - paisseon paekiji insig
이름 변경이 완료된 모습입니다

여기까지 된 상태에서 다시 practice.py 소스코드를 실행하면 thailand 모듈의 경로가 바뀐 것을 알 수 있습니다.

Thailand 외부에서 모듈 호출
c:\Python38\lib\travel\thailand.py

즉, 호출하려는 파일과 같은 경로가 아닌 파이썬 설치 경로의 lib 폴더에 있는 패키지를 사용한 것이며, 이는 여러분이 새로운 파이썬 프로젝트를 생성하여 작업을 할 때도 동일하게 travel 패키지를 가져다 쓸 수 있다는 의미가 됩니다.

원상복귀를 위해 파이썬 설치 경로의 lib 폴더 밑에 붙여넣기 했던 travel 폴더 (필자의 경우 C:\Python38\lib\travel) 는 삭제를 하고, Visual Studio Code 내에서 이름 변경을 했던 travel_temp 폴더는 다시 travel 로 이름을 되돌려 줍니다.

파이썬 패키지 인식 - paisseon paekiji insig
원상복귀 완료된 모습입니다

이것저것 프로그래밍 정리(Macbook)

Mac

Jupyter Notebook - python 경로, pip module 인식 못함

parkaparka 2020. 10. 12. 14:07

Jupyter Notebook을 맨처음에 사용하다 보면 python의 경로 혹은 다른 문제 때문에 아래 사진처럼 분면 pip를 통해서 install 했음에도 python shell에서는 import 할수 있음에도 불구하고 설치한 모듈(ex) pandas, tensorflow)들을 Jupyter에서는 import 하지 못하고 No module named 'module' 이라는 ModuleNotFoundError이 발생할 때가 있다.

저는 python3, jupyter는 homebrew를 통해서 설치했고, numpy, pandas 등 다른 모듈들은 pip를 통해 설치한 상태입니다.

파이썬 패키지 인식 - paisseon paekiji insig
python shell에서는 import 되지만 jupyter에서는 import 되지 않는 numpy
파이썬 패키지 인식 - paisseon paekiji insig
import numpy가 문제 없이 import 되는 numpy

이 문제를 해결해 보도록 하자.


먼저 python shell과 Jupyter notebook에서 각각 어떤 파이썬을 사용하고 있는지 아래 명령어를 통해서 확인해보도록 하자.

import sys
print(sys.executable)
파이썬 패키지 인식 - paisseon paekiji insig
Jupyterlab 안에서 자체적으로의 python 3.8을 사용하고 있는 jupyter
파이썬 패키지 인식 - paisseon paekiji insig
Brew를 통해 설치한 python3.8을 사용중인 python shell

pip를 통해서 모듈을 설치하면 /usr/local/lib/python3.8/site-packages 에 모듈들이 설치 되는 것을 확인 할 수 있다. 

하지만 python shell과 jupyter notebook이 서로 다른 python3의 경로를 사용하기 때문에 /usr/local/lib/python3.8/site-packages 에 모듈이 설치 되어 있어도 jupyter notebook에서는 사용을 할 수 없는 것 같다. 

이번에는 아래 명령어를 통해 python shell 과 jupyter notebook에 등록 되어있는 환경변수를 확인해보자.

import sys
print(sys.path)
파이썬 패키지 인식 - paisseon paekiji insig
파이썬 패키지 인식 - paisseon paekiji insig
/usr/local/lib/python3.8/site-pachages가 python shell의 환경변수로 있는 것 확인 가능

이제 jupyter 자체에서 환경변수를 추가해주던가 아니면 jupyter에서 사용하는 파이썬을 brew를 통해 설치한 python으로 변경해주도록 하자.


방법 1.  jupyter 환경변수에 local 환경의 python3의 pip 경로 추가해주기

먼저 python은 그대로 두고 jupyter의 환경변수에 /usr/local/python3.8/site-packages 를 추가해서 pip를 통해 설치한 모듈들을 사용 할 수 있게 해주도록 하자.

아래 명령어를 통해서 환경변수를 추가해주도록 하자

import sys
sys.path.append("PATH")

brew를 통해 python3를 설치하고 pip를 통해 모듈들을 설치했으면 /usr/local/python3.8/site-packages 에 pip module들이 설치 되어 있을 것이다. 위 경로를 환경변수로 추가해주자.

import sys
sys.path.append('/usr/local/python3.8/site-packages')
파이썬 패키지 인식 - paisseon paekiji insig

이후 환경변수가 제대로 추가 되었는지 jupyter에서 sys.path 명령어를 통해 확인해 보도록 하자.

파이썬 패키지 인식 - paisseon paekiji insig

마지막에 보면 우리가 원하는 변수가 등록되어있는 것을 확인 할수 있다.

이제 실제로 import를 해 보도록 하자.

파이썬 패키지 인식 - paisseon paekiji insig

sys.path.append() 를 통해서 경로를 추가해 준 이후 import numpy 가 제대로 작동하는 것을 확인 할 수 있다.

하지만 위 방법은 python shell 과 jupyter가 각각 다른 python을 사용하고 있는 것이고 jupyter가 python shell의 pip를 끌어와서 쓰는 개념이라 볼수 있다.

또한 매번 sys.path.append() 를 해줘야하는 불편함 또한 있다.

이번에는 jupyter에서 사용하는 python을 local에서 쓰는 brew를 통해 install한 python3로 변경해 주는 방법을 알아 보도록 하자.


방법 2. jupyter에서 사용하고 있는 python3를 local에서 사용하고 있는 python3로 변경하기

터미널에서 아래 명령어를 통해서 현재 jupyter에서 어떤 파이썬을 사용할수 있는지 확인해보자.

jupyter kernelspec list
파이썬 패키지 인식 - paisseon paekiji insig

현재 brew를 통해 설치된 python3가 아닌 jupyterlab 안의 python을 사용중인 것을 확인 할 수 있다.

python3 kernel을 아래 명령어를 통해서 brew를 통해 설치한 python3로 재설치 해주도록 하자.

python3 -m ipykernel install --user
파이썬 패키지 인식 - paisseon paekiji insig

이후 jupyter kernelspec list 명령어를 통해서 사용 중인 python을 다시 한번 확인해보도록 하자.

파이썬 패키지 인식 - paisseon paekiji insig

위와는 다른 python3 경로로 변경되어 있는 것을 확인 할 수 있다.

이번에는 python shell과 jupyter notebook에서 sys.path 와 sys.execatable을 통해 한번 비교해보도록 하자.

먼저 sys.executable을 비교해 보도록 하자.

파이썬 패키지 인식 - paisseon paekiji insig
파이썬 패키지 인식 - paisseon paekiji insig

python3를 변경해줬기에 조금의 차이가 있지만 필요한 것들은 모두 같은 것을 확인 할 수 있다.

이번에는 sys.execuatble 명령어를 비교해보자.

파이썬 패키지 인식 - paisseon paekiji insig
파이썬 패키지 인식 - paisseon paekiji insig

sys.executable의 결과가 둘이 같은 것을 확인 할 수 있다.

위와 같이 python3를 변경한 이후 이제 실제로 모듈을 import 한 이후 제대로 작동하는지 확인해 보도록 하자.

위와 마찬가지로 numpy를 import해서 간단한 numpy array를 만들어보자.

파이썬 패키지 인식 - paisseon paekiji insig

방법 1과 마찬가지로 잘 작동하는 것을 확인 할 수 있다.

pip를 통해 module을 설치했음에도 불구하고 ModuleNotFoundError가 발생할때 방법1과 방법2 모두 해결 가능 하지만, 방법1은 임시 방편의 느낌이기에 방법2를 추천한다.