• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

RuntimeError: populate() isn't reentrant

23.01.10 17:00 작성 조회수 418

1

안녕하세요 강사님

 

RuntimeError: populate() isn't reentrant

에러관련해서 검색을 해봤더니, 환경 by 환경의 문제 같더라구요 ㅠㅠ 핵심을 잘 못짚겠어서 고치질 못하기에

여태 주피터 노트북 활용하는 강의는 따라하질 못하고 막혀있는데요.

어떻게 해결하면 될까요?

#1 이게 제 코드구여

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'instagram.settings'
# os.environ["DJANGO_ALLOW_UNSAFE"] = 'true'
os.environ['DJANGO_ALLOW_ASYNC_UNSAFE'] = 'true'

import django
django.setup()

#2 이게 에러 메세지 이구요

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Input In [3], in <cell line: 7>()
      4 os.environ['DJANGO_ALLOW_ASYNC_UNSAFE'] = 'true'
      6 import django
----> 7 django.setup()

File ~/opt/anaconda3/lib/python3.9/site-packages/django/__init__.py:24, in setup(set_prefix)
     20 if set_prefix:
     21     set_script_prefix(
     22         "/" if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME
     23     )
---> 24 apps.populate(settings.INSTALLED_APPS)

File ~/opt/anaconda3/lib/python3.9/site-packages/django/apps/registry.py:83, in Apps.populate(self, installed_apps)
     78 # An RLock prevents other threads from entering this section. The
     79 # compare and set operation below is atomic.
     80 if self.loading:
     81     # Prevent reentrant calls to avoid running AppConfig.ready()
     82     # methods twice.
---> 83     raise RuntimeError("populate() isn't reentrant")
     84 self.loading = True
     86 # Phase 1: initialize app configs and import app modules.

RuntimeError: populate() isn't reentrant

이에 따라서 에러메세지에 표시된 경로에 위치한 init.py 파일 내용입니다.

from django.utils.version import get_version

VERSION = (4, 1, 1, "final", 0)

__version__ = get_version(VERSION)


def setup(set_prefix=True):
    """
    Configure the settings (this happens as a side effect of accessing the
    first setting), configure logging and populate the app registry.
    Set the thread-local urlresolvers script prefix if `set_prefix` is True.
    """
    from django.apps import apps
    from django.conf import settings
    from django.urls import set_script_prefix
    from django.utils.log import configure_logging

    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
    if set_prefix:
        set_script_prefix(
            "/" if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME
        )
    apps.populate(settings.INSTALLED_APPS)

답변 1

답변을 작성해보세요.

1

안녕하세요.

현재 사용 중이신 jupyter notebook에서 상단 메뉴 중에 Kernel -> Restart & Clear Output 메뉴를 통해, 커널을 재시작 후에 다시 수행해보시면 어떤가요?

image

RuntimeError: populate() isn't reentrant 오류는 django.setup()가 여러 번 호출되었을 경우에 발생하는 경우가 종종 있더라구요.
커널을 재시작하면 모든 코드 수행내역이 초기화되니까, 그 후에 django.setup() 코드를 1회만 수행하시고 실습을 이어나가보세요.

확인해보시고 댓글 부탁드립니다.

화이팅입니다. :-)

알려주신대로 저 커널 에서 리스타트 & 클리어 아웃풋을 혹시몰라서 4차례씩 해봤는데도 안되더라구요 ㅠㅠ

지금의 장고 프로젝트와 문제의 쥬피터 노트북 파일을 압축해서 me@askcompany.kr 로 보내주시겠어요?

네! 그런데 메일로 보내드리는 것 보다 깃헙이 더 나으실수도 있을것같아서
https://github.com/daniel4191/new_instagram
깃헙링크도 같이 드립니다! 메일은 보내드렸습니다!

다른점이 있다면 저는 프로젝트 이름을 instagram으로 했고,

따라서 instagram이라는 app 네임 대신에 gram으로 사용하고 있습니다!

메일로 보내주신 프로젝트에서, python 3.9 로 가상환경 생성하고, 아래 라이브러리 목록으로 최신버전을 설치하고,

django==4.1.5
django-extensions==3.2.1
django-debug-toolbar==3.8.1
pillow==9.4.0
jupyter

python -m jupyter notebook 명령으로 쥬피터 노트북을 실행시켜서, 아래와 같이 수행해보니, 저는 그 오류가 재현이 안 되네요.

image

흠. 가상환경 재생성/활성화하시고, 위 라이브러리 목록으로 라이브러리를 재설치하시고, python -m jupyter notebook 명령으로 쥬피터 노트북을 다시 실행해서 확인해보시겠어요?

위 목록을 requirements.txt 파일로 저장하시고, python -m pip install -r requirements.txt 명령으로 설치하시는 겁니다.

화이팅입니다. :-)

감사합니다!!

기존에는 터미널에 jupyter notebook이라고 쓰다가
계속 아까와같은 에러가 나기에, 같은 케이스로 다른분들이 겪은 사례는 없을까 찾던중, 동일한 케이스를 찾았습니다.

거기에는 python -m jupyter로 하면 된다고 하셨던 것으로 기억합니다.

그래서 그대로 해봤더니 역시나 에러가 생기길래 이상해서 pip install jupyter

를 해준 후에도 python -m jupyter로도 해봐서 안되기에 계속 아나콘다를 참조하는 jupyter notebook에서 이도저도 못하고 있었는데

저에게 핵심은 python 가상환경을 참조하는 python -m jupyter notebook

이 포인트였습니다!

도움주셔서 너무 감사드립니다!! ㅠㅠ