인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

최다니엘님의 프로필 이미지
최다니엘

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

관계를 표현하는 모델 필드 (OneToOneField)

RuntimeError: populate() isn't reentrant

작성

·

597

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

이 포인트였습니다!

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

 

 

최다니엘님의 프로필 이미지
최다니엘

작성한 질문수

질문하기