如何在现有Django项目中使用Jupyter?遇两类问题求解答
在Jupyter中访问Django应用的问题排查与解决
问题背景
尝试两种方法在Jupyter中访问Django应用,均失败:
方法1:手动配置Django环境
创建Jupyter文件并添加配置代码:
import sys, os print('Python %s on %s' % (sys.version, sys.platform)) import django print('Django %s' % django.get_version()) sys.path.append('D:/VSCODE/GPOSSYS') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') if 'setup' in dir(django): django.setup()
执行后报错:
1 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') 2 if 'setup' in dir(django): 3 django.setup() File d:\\VSCODE\\GPOSSYS\\.venv\\Lib\\site-packages\\django\\__init__.py:24, in setup(set_prefix) 20 if set_prefix: 21 set_script_prefix("/" if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME) 24 apps.populate(settings.INSTALLED_APPS) File d:\\VSCODE\\GPOSSYS\\.venv\\Lib\\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
方法2:使用django-extensions
安装jupyter、Django-extensions并添加到INSTALLED_APPS,运行python manage.py shell_plus --notebook报错:
Traceback (most recent call last): File "D:\VSCODE\GPOSSYS\.venv\Lib\site packages\django_extensions\management\commands\shell_plus.py", line 281, in get_notebook from notebook.notebookapp import NotebookApp ModuleNotFoundError: No module named 'notebook.notebookapp' CommandError: Could not load shell runner: 'IPython Notebook'.
错误分析与解决办法
针对方法1的报错
RuntimeError: populate() isn't reentrant 说明Django的初始化逻辑被重复触发。解决方式:
- 重启Jupyter内核,避免内核中已加载过Django环境导致重复初始化;
- 修改代码,添加初始化状态判断,避免重复执行setup:
import sys, os print('Python %s on %s' % (sys.version, sys.platform)) import django print('Django %s' % django.get_version()) # 仅在未初始化时执行配置 if not hasattr(django, 'apps') or not django.apps.ready: sys.path.append('D:/VSCODE/GPOSSYS') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') django.setup()
针对方法2的报错
ModuleNotFoundError: No module named 'notebook.notebookapp' 是因为虚拟环境中缺少notebook依赖包。解决步骤:
- 在虚拟环境中安装notebook:
pip install notebook
- 确保django-extensions与当前Django版本兼容,若版本不匹配,可指定安装兼容版本(例如Django 4.x对应django-extensions>=3.2.0):
pip install django-extensions>=3.2.0
- 重新运行启动命令:
python manage.py shell_plus --notebook
替代可行方法
如果上述方法仍有问题,可尝试以下方案:
- 使用
django-jupyter包:安装后直接在项目根目录运行python manage.py jupyter,启动已关联Django环境的Jupyter; - 配置专属Jupyter内核:在虚拟环境中执行
ipython kernel install --user --name=my_django_env,然后在Jupyter界面选择该内核,再执行方法1的初始化代码(注意确保项目路径正确)。
内容的提问来源于stack exchange,提问作者Peter Johnson
相关产品推荐
相关产品推荐

