Python - FastAPI를 이용해서 데이터 분석 플랫폼을 개발을 시작했다.
기본적으로 Pycharm을 사용하지만, 통계관련 단위기능을 확인하고자 Jupyter Notebook을 Window PC에 설치했다.
https://www.anaconda.com/download/success
Download Now | Anaconda
Anaconda is the birthplace of Python data science. We are a movement of data scientists, data-driven enterprises, and open source communities.
www.anaconda.com
옛날에 Jupyter Notebook을 사용했던 기억을 가지고 Anaconda Prompt에서 jupyter notebook을 쳤는데 다음과 같은 에러가 발생했다.
(base) PS C:\Users\{UserName}> jupyter notebook
Traceback (most recent call last):
File "D:\Anaconda_Python\Scripts\jupyter-notebook-script.py", line 6, in <module>
from notebook.app import main
File "D:\Anaconda_Python\Lib\site-packages\notebook\app.py", line 12, in <module>
from jupyter_server.base.handlers import JupyterHandler
File "D:\Anaconda_Python\Lib\site-packages\jupyter_server\base\handlers.py", line 21, in <module>
import prometheus_client
File "D:\Anaconda_Python\Lib\site-packages\prometheus_client\__init__.py", line 3, in <module>
from . import (
File "D:\Anaconda_Python\Lib\site-packages\prometheus_client\process_collector.py", line 10, in <module>
_PAGESIZE = resource.getpagesize()
^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'resource' has no attribute 'getpagesize'
최종 에러는 AttributeError: module 'resource' has no attribute 'getpagesize' 즉, resource가 getpagesize라는 method 또는 function을 가지고 있지 않다는 것이다.
위의 에러메시지에서 말한대로 아래의 경로에 따라
D:\Anaconda_Python\Lib\site-packages\prometheus_client\process_collector.py
해당 process_collector.py 파일을 보면 처음 부분에 try except문이 들어와 있는 것을 확인할 수 있다.
import os
from typing import Callable, Iterable, Optional, Union
import resource
from .metrics_core import CounterMetricFamily, GaugeMetricFamily, Metric
from .registry import Collector, CollectorRegistry, REGISTRY
try:
import resource
_PAGESIZE = resource.getpagesize()
except ImportError:
# Not Unix
_PAGESIZE = 4096
[에러 분석]
unix 계열이면 resource가 존재하고 Unix가 아닌경우 _PAGESIZE =4096으로 한 것을 확인할 수 있다. 이 부분은 OS의 Page단위당 4KB로 쪼개는 것을 의미하는 것 같다.
에러에서 resource를 찾을수 없다고 했고, 현재 Window를 쓰고 있으니까, 이 부분에서 except부분이 제대로 먹지 않는구나 싶다. 그래서 해당 Python 시스템 Code를 다음과 같이 바꾸어 주었다. (어차피 Window만 사용한다는 가정)
import os
from typing import Callable, Iterable, Optional, Union
import resource
from .metrics_core import CounterMetricFamily, GaugeMetricFamily, Metric
from .registry import Collector, CollectorRegistry, REGISTRY
try:
import resource
if os.name == 'posix':
_PAGESIZE = resource.getpagesize()
else:
_PAGESIZE = 4096
except ImportError:
# Not Unix
_PAGESIZE = 4096
사실 except 부분은 빼도 될 것 같았지만, 그냥 try부분에 posix (unix)계열일때 resource 메소드 이용 그 외에는 4KB그냥 할당 이런식으로 바꾸어 주었다.
그 이후 Anaconda Prompt에 jupyter notebook을 다시 타이핑하고 시도했다. 그 결과, 또 새로운 에러를 맞이했다.
(base) PS C:\Users\{UserName}> jupyter notebook
[W 2024-09-24 15:42:11.365 ServerApp] Jupyter Server Terminals requires Jupyter Server 2.0+
[I 2024-09-24 15:42:13.177 ServerApp] jupyter_lsp | extension was successfully linked.
[I 2024-09-24 15:42:13.185 ServerApp] jupyterlab | extension was successfully linked.
[I 2024-09-24 15:42:13.191 ServerApp] notebook | extension was successfully linked.
[I 2024-09-24 15:42:13.522 ServerApp] notebook_shim | extension was successfully linked.
[I 2024-09-24 15:42:13.522 ServerApp] panel.io.jupyter_server_extension | extension was successfully linked.
Traceback (most recent call last):
File "D:\Anaconda_Python\Scripts\jupyter-notebook-script.py", line 10, in <module>
sys.exit(main())
^^^^^^
File "D:\Anaconda_Python\Lib\site-packages\jupyter_server\extension\application.py", line 567, in launch_instance
serverapp = cls.initialize_server(argv=args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Anaconda_Python\Lib\site-packages\jupyter_server\extension\application.py", line 537, in initialize_server
serverapp.initialize(
File "D:\Anaconda_Python\Lib\site-packages\traitlets\config\application.py", line 118, in inner
return method(app, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Anaconda_Python\Lib\site-packages\jupyter_server\serverapp.py", line 2318, in initialize
self.init_resources()
File "D:\Anaconda_Python\Lib\site-packages\jupyter_server\serverapp.py", line 1875, in init_resources
old_soft, old_hard = resource.getrlimit(resource.RLIMIT_NOFILE)
^^^^^^^^^^^^^^^^^^
AttributeError: module 'resource' has no attribute 'getrlimit'
두 번째 에러는 AttributeError: module 'resource' has no attribute 'getrlimit' 와 같았다. 또 resource관련 문제다. 아마 앞의 try-except과 비슷한 문제일거라고 생각된다.
마찬가지로 위의 에러 메시지의 경로를 따라가서 py파일을 열어보았다.
D:\Anaconda_Python\Lib\site-packages\jupyter_server\serverapp.py
처음 부분에 위와 똑같은 구조를 가지고 있었다. except부분이 제대로 안먹는 것이다.
try:
import resource
except ImportError:
# Windows
resource = None
위의 Python 시스템 코드를 다음과 같이 바꾸었다.
try:
import resource
resource = None
except ImportError:
# Windows
resource = None
어차피 윈도우상의 - 아나콘다 가상환경에 깔린 파이썬이기도 하고, 시스템 코드를 좀 바꿔도 상관 없겠지 싶어 위와 같이 try부분에 resource = None부분을 추가했다.
위의 두 Python System Code를 수정했더니 Jupyter notebook이 실행되었다.
참고로 Python의 Resource관련 문서입니다.
https://docs.python.org/3/library/resource.html
resource — Resource usage information
This module provides basic mechanisms for measuring and controlling system resources utilized by a program. Availability: Unix, not Emscripten, not WASI. Symbolic constants are used to specify part...
docs.python.org