ChatGPT解决这个技术问题 Extra ChatGPT

如何为 Django 设置 Jupyter/IPython Notebook?

我一直在使用 this post 中描述的方法来设置 IPython Notebook 以与 Django 很好地配合使用。该方法的要点是创建一个 IPython 扩展,它设置 DJANGO_SETTINGS_MODULE 并在 IPython 启动时运行 django.setup()。

扩展的代码是:

def load_ipython_extension(ipython):
    # The `ipython` argument is the currently active `InteractiveShell`
    # instance, which can be used in any way. This allows you to register
    # new magics or aliases, for example.
    try:
        import os
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
        import django
        django.setup()
    except ImportError:
        pass

随着最近升级到 Jupyter Notebook,这个设置现在对我来说已经坏了。通过向笔记本的第一个单元格添加类似的代码,我可以在 Jupyter 笔记本中运行 Django 代码。但是,我无法弄清楚如何让 Jupyter 自动运行扩展程序,因此我不必为我正在创建的每个笔记本再次执行此操作。

我应该怎么做才能让 Django 和 Jupyter 玩得很好?

更新:对于@DarkLight - 我将 Django 1.8.5 与 Jupyter 1.0.0 一起使用。我在笔记本中运行的代码是:

import os, sys
sys.path.insert(0, '/path/to/project')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settingsfile")
import django
django.setup()
你知道怎么做吗? Django shell_plus --notebook 对我不起作用,显示应用程序未加载错误。
@DarkLight - 我最终从一个脚本运行命令,我将它添加到每个新笔记本的第一个单元格中。不是很漂亮,但它有效。
你能告诉我你正在使用的 django、ipthon 和 jupyter 的版本,以及你正在使用的代码(如果它与答案中的不同)。因为对我来说, django.setup() 调用只会导致 ipython 单元挂起。
当我在设置文件中设置 DEBUG=False 时,它终于起作用了。知道是什么问题吗?
@DarkLight 不知道 debug=False。我已经在我的开发环境中运行了它,它使用 debug=True 没有问题。我会尽快用您提出的信息更新问题。

D
Dimitrios Mistriotis

从 https://github.com/django-extensions/django-extensions/blob/master/docs/index.rst 安装 django-extensions pip install django-extensions 更改您的设置文件以包含 'django-extensions' INSTALLED_APPS += [ 'django_extensions'] 像这样运行你的 Django 服务器: python manage.py shell_plus --notebook alter to suit,并在你的第一个单元格 import os, sys PWD = os.getenv('PWD') os.chdir(PWD) 中运行它sys.path.insert(0, os.getenv('PWD')) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "local_settings.py") import django django.setup() 现在你应该可以导入你的 django 模型了等等 例如:从 app.models 导入 Foobar Foobar.objects.all()


如果您使用“Django Shell-Plus”内核创建笔记本,即使没有第 4 点,它也可以工作
重要的是,它有一些依赖项:ipythonjupyter。您可以安装它们pip install ipythonpip install jupyter
如果您正在使用 django-configurations,请使用以确保正确:django-configurations.readthedocs.io/en/latest/cookbook/…
@igo 在我的情况下,我在这里,因为没有第 4 点它不起作用。我还建议备用第 5 点。可以添加一个单元格,而不是导入模型,然后从 python manage.py runserver 复制粘贴这些导入语句.然后他们可以使用模型而无需手动导入。
我能够完成第 3 点,但是在我的浏览器中打开的笔记本没有连接到内核并给出连接失败的错误。你能帮我吗? @我去
S
Sifnos

只是为了完整性(但它是 2018 年,所以自从发布这个问题以来情况可能发生了变化):您实际上可以在您的 Django 环境中安装一个 Jupyter Python 内核,然后将连接(运行)不同的 Jupyter 服务器/环境(你在已安装小部件、扩展程序、更改主题等)。 django_extensions 现在仍然只做部分必需的工作 :-)

这假设您有一个独立于 Django 的 Jupyter 虚拟环境,并且其内核/扩展与 --user 一起安装。所有的 Jupyter 扩展(及其依赖项)都安装在这个 venv 中,而不是 Django 的一个/一个(如果你需要将它们与 Django 代码一起使用,你仍然需要在 Django 环境中使用 pandas、matplotlib 等)。

在您的 Django 虚拟环境(可以运行不同版本的 Python,包括版本 2 解释器)中安装 ipython 内核:

pip install -U ipykernel
ipython kernel install --user --name='environment_name' --display-name='Your Project'

这将在用户的 Jupyter 内核目录(在 Linux 上是 ~/.jupyter/ 而在 OSX 上是 ~/Library/Jupyter/)中创建一个具有指定 --name 的内核配置目录,其中包含其 kernel.json 文件和图像/图标(默认情况下是默认的 Jupyter使用我们正在安装的内核的图标)。该内核将在创建时处于活动状态的虚拟环境中运行,因此使用完全相同版本的 python 和我们的 Django 项目使用的所有已安装模块。

运行 ./manage.py shell_plus --notebook 做的事情非常相似,但除了需要在当前 venv 中安装所有东西(包括 Jupyter 服务器和所有扩展)之外,它还无法在与项目根目录不同的目录中运行笔记本(包含 {2 })。此外,它将使用它在路径上找到的第一个名为 python 的可执行文件运行内核,而不是虚拟环境的可执行文件,这使得它在未从活动 Django 虚拟环境中的命令行启动时行为不端。

为了解决这些问题,以便我们能够创建一个在我们如此配置的任何 Django 项目中运行的 Notebook,并能够运行存储在文件系统上任何位置的笔记本,我们需要:

确保第一个 'argv' 参数包含虚拟环境中包含的 python 解释器的完整路径添加(如果尚未存在)将包含 shell 环境变量的 'env' 部分,然后使用这些告诉 Python 在哪里可以找到我们的项目以及它应该使用哪些 Django 设置。我们通过添加如下内容来做到这一点:

   "env": {
      "DJANGO_SETTINGS_MODULE": "my_project.settings",
      "PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
   }

可选:将“display_name”更改为人性化并替换图标。

编辑这个环境 kernel.json 文件你会看到类似的东西:

{
 "display_name": "My Project", 
 "language": "python", 
 "env": {
  "DJANGO_SETTINGS_MODULE": "my_project.settings",
  "PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
 },
 "argv": [
  "/home/projectuser/.pyenv/versions/2.7.15/envs/my_project_venv/bin/python", 
  "-m", 
  "ipykernel_launcher", 
  "-f", 
  "{connection_file}",
  "--ext",
  "django_extensions.management.notebook_extension"
 ]
}

值得注意的线路:

“DJANGO_SETTINGS_MODULE”:“my_project.settings”:您的设置,通常在项目的 manage.py 中看到

"PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project": PYTHONPATH 扩展为包含项目的主目录(包含 manage.py 的目录),这样即使内核没有运行也可以找到设置那个确切的目录(这里 django_extensions 将使用通用 python,因此运行错误的虚拟环境,除非从其中启动整个 Jupyter 服务器:将其添加到由 django_extensions 创建的 kernel.json 将使其能够在 Django 项目中的任何位置运行笔记本目录)

“/home/projectuser/.pyenv/versions/2.7.15/envs/my_project_venv/bin/python”:内核执行的第一个参数(argv列表),应该是项目虚拟环境的python解释器的完整路径(这是django_extensions 出错的另一件事:修复此问题将允许任何笔记本服务器运行该特定 Django 环境的内核及其所有已安装的模块)

“django_extensions.management.notebook_extension”:这是将在笔记本中加载“shell_plus”功能的扩展(可选但有用:-))


惊人的答案!谢谢!这绝对是最好的设置。如果不清楚,请在 ~/Library/Jupyter/{your-kernel-name}/ (对于 Mac)和 ~/.jupyter/ 对于 Linux 类似地找到 kernel.json。
PYTHONPATH 不应该与 manage.py 相同,所以通常是 "/home/user/devel/my_project" 而不是 "...my_project/myproject" ?
@NguyễnTrọngTín 是的,但这取决于您如何构建项目......我们在 Django 之上有一个双 project_name 文件夹,用于包含与 Django 无关的内容。我同意这令人困惑,我将尝试编辑示例
完美的把戏!只是为了避免消息的完整性:“Django:SynchronousOnlyOperation:您不能从异步上下文中调用它-使用线程或sync_to_async”,这是在django.setup()之前在ipynb文件开头添加的内容:os.environ [ "DJANGO_ALLOW_ASYNC_UNSAFE"] = "真" stackoverflow.com/questions/61926359/…
M
Mark Chackerian

这就是对我有用的东西

按照其他答案安装 Django 扩展(我使用 1.9.6)安装 jupyter pip install jupyter 我在 Docker 容器中设置 jupyter 所做的一些事情 - 如果这适用于您,请参见下文† 从您的基本 Django 目录创建一个目录笔记本,例如 mkdir notebooks 进入那个目录 cd notebooks start django extensions shell_plus 从那个目录里面: ../manage.py shell_plus --notebook 笔记本服务器现在应该正在运行,并且可能会启动一个新的浏览器。如果它没有启动浏览器窗口,请按照说明粘贴链接或令牌。根据 John Mee 的答案截图,从浏览器中打开一个新的“Django Shell Plus”笔记本

并且,重要的是,没有工作的是从笔记本环境中更改目录。如果我尝试使用不在运行 manage.py shell_plus --notebook 的目录中的任何笔记本,则内核配置不正确。对我来说,一次只为一个目录配置笔记本就足够了。如果您需要更强大的解决方案,您应该能够在启动 jupyter 之前设置 PYTHONPATH。例如,将 export PYTHONPATH="$PYTHONPATH:/path/to/django/project" 添加到 virtualenv 激活脚本。但我没有试过这个。

† Docker 设置(可选)

为您的容器添加端口映射 8888

例如,在您的 docker compose 文件中;

ports:
      -  "8890:8888"

将项目设置文件配置为使用 ip 0.0.0.0

这就是我所做的:

NOTEBOOK_ARGUMENTS = [
    '--ip', '0.0.0.0', 
    '--allow-root',
    '--no-browser', 
]

当您 cd 到 notebooks 时,该目录中是否有 manage.py 或者您如何从那里运行它?
我必须将 manage.py 添加到我的 PATY 中——也许可以尝试 django-admin.py。
尝试运行 ../manage.py shell_plus --notebook,注意 ../。对我来说很好用 Django 2.1。
NOTEBOOK_ARGUMENTS 部分对我来说很关键,谢谢!
l
lmiguelvargasf

注意:我使用的是 Python 3.7 和 Django 2.1,它适用于 Django 2.2。我不必在我的第一个单元格中运行任何东西,只要您不介意将笔记本放在 Django 项目的根目录中,这就像魅力一样。

假设您的项目有一个虚拟环境,并且它已被激活。我使用 pipenv 来创建虚拟环境并跟踪我的 python 项目的依赖关系,但这取决于您使用什么工具。

还假设您已经创建了一个 Django 项目,并且您当前的工作目录是该项目的根目录。

脚步

使用 pip pip install jupyter 使用 pipenv pipenv install jupyter 安装 django-extensions 使用 pip pip install django-extensions 使用 pipenv pipenv install django-extensions 通过将 django-extensions 添加到 Django 项目 settings.py 文件的 INSTALLED_APPS 设置来设置.: INSTALLED_APPS = ( ... 'django_extensions', ) 运行作为 django-extensions 一部分的 shell_plus 管理命令。使用选项 --notebook 启动笔记本: python manage.py shell_plus --notebook Jupyter Notebooks 将在您的浏览器中自动打开。启动一个新的 Django Shell-Plus 笔记本

https://i.stack.imgur.com/b0774.png

而已!

同样,您不必在第一个单元格中运行任何内容,您可以通过运行 dir() 来确认当前本地范围内的名称。

https://i.stack.imgur.com/wMR7T.png

编辑:

如果要将笔记本放在根目录下名为 notebooks 的目录中,可以执行以下操作:

$ mkdir notebooks && cd notebooks
$ python ../manage.py shell_plus --notebook

感谢 Mark Chackerian,他的回答提供了在项目根目录以外的目录中运行笔记本的想法。

这些是通过 shell_plus 自动导入的模块:

# Shell Plus Model Imports
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
# Shell Plus Django Imports
from django.core.cache import cache
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import transaction
from django.db.models import Avg, Case, Count, F, Max, Min, Prefetch, Q, Sum, When, Exists, OuterRef, Subquery
from django.utils import timezone
from django.urls import reverse

我将我的 not book 保存在应用程序的目录中,并从根目录运行 python manage.py shell_plus --notebook,导致错误 myproject module not found 并且笔记本无法正常工作,按照建议我从目录 python ../../manage.py shell_plus --notebook 运行笔记本并且一切正常现在很好 - 谢谢! @Imiguelvargasf
J
John Mee

实际上,您(可能不需要)需要做所有这些废话。只需安装 django-extensions 并运行 jupyter!

(myprojectvenv)$ cd myproject    
(myprojectvenv)$ pip install jupyter
(myprojectvenv)$ pip install django-extensions
(myprojectvenv)$ jupyter notebook

https://i.stack.imgur.com/FoCeQ.png

你应该很高兴。例如:

from myproject.models import Foobar
Foobar.objects.all()

确保您还在 virtualenv pip install jupyter 中安装了 jupyter
事实上,你确实需要做所有这些废话。您的方法在干净的环境中不起作用。您可能有其他假设和/或声明您没有在更简单的答案中表达。
这在我第一次尝试时对我有用,然后第二次没有用(!?)事实证明,工作和不工作之间的区别是笔记本文件的路径。因此,如果您想将笔记本文件保存在项目的顶级目录中,这个答案可能很好——这是前面评论的“假设”。
p
pyano

以下对我使用 win10、Python 3.5、Django 1.10 确实有效:

使用 Anaconda 发行版安装 Python,以便同时安装 Jupyter

安装 Django 并安装 django-extensions: pip install Django pip install django-extensions

启动一个新的 Django 项目。您必须在 Jupyter 稍后可以访问的目录树的那部分中执行此操作。 django-admin startproject _myDjangoProject_

启动 Jypter

将 Jupyter 导航到 myDjangoProject 目录并输入第一个/顶部 myDjangoProject-directory

在第一个/顶部 myDjangoProject 目录中开始一个新的 Jupyter 笔记本:new --> Django Shell-Plus

输入并运行以下代码: import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myDjangoProject.settings") import django django.setup()

注意这段代码和manage.py中的一样,注意“myDjangoProject.settings”指向myDjangoProject/settings.py

现在你可以从例子开始,eg: from django.template import Template, Context template = Template('这个项目的名字是{{ projectName }}') context = Context({'projectName': 'MyJypyterDjangoSite'}) template .render(上下文)


R
Rafters

虽然 RobM 接受的答案有效,但它并不像它可能的那样清楚,并且有一些不必要的步骤。简而言之,要从项目目录之外的笔记本环境中通过 Django 运行笔记本:

安装:

 pip install django-extensions

'django-extensions' 添加到 settings.py 中的 INSTALLED_APPS 列表

 INSTALLED_APPS += ['django_extensions']

在 Django 中运行一个笔记本,然后关闭它:

python manage.py shell_plus --notebook

这将创建您的内核,我们现在将对其进行编辑以指向 Python 的绝对路径而不是相对路径。

在 OSX 上,内核文件位于:~/Library/Jupyter/kernels/django_extensions/kernel.json

在 Linux 上:~/.jupyter/kernels/django_extensions/kernel.json

我们只需要做两处改变:

第一种是将 "argv" 列表中的第一个值从 "python" 编辑为您的 Django 虚拟环境中 python 版本的完整地址。例如:"/Users/$USERNAME/Documents/PROJECT_FOLDER/venv/bin/python"

其次,在 "env" 字典中添加 "DJANGO_SETTINGS_MODULE": "mysite.settings",,其中 mysite 是包含您的 Django 设置的文件夹。

(可选)更改 "display_name" 的值。

现在,当您从任何目录运行笔记本时,选择 "Django Shell-Plus" 内核将允许您的笔记本与 Django 交互。任何包(例如 pandas)都需要安装在 Django venv 中。


p
praveen chaudhary

运行此命令。

PYTHONPATH=/path/to/project/root DJANGO_SETTINGS_MODULE=settings python manage.py shell_plus --notebook

A
Alessandro Dentella

我将在 RobM 的非常完整的 answer 中添加一些信息,以造福于像我一样使用 buildout 和 djangorecipe djangorecipe 的极少数开发人员......我在使用时指的是 jupyter 实验室,但是我认为所有信息都可以应用于旧的 jupyter 笔记本。

使用 buildout 时,您最终会使用“bin/django”处理程序,而不是“manage.py”。那是定义整个路径的脚本。我在 buildout.cfg 中又添加了一个部分:

[ipython]
recipe = zc.recipe.egg
eggs =  ${buildout:eggs}
extra-paths = ${buildout:directory}/apps
initialization =  import os
   os.environ['DJANGO_SETTINGS_MODULE'] = 'web.settings'

以便在 ./bin 目录中创建另一个名为 ipython 的脚本。我将 kernelspec 指向那个解释器。此外,我使用 kernel 参数而不是 "-m", "ipykernel_launcher",因此我使用的内核定义是:

{
    "argv": [
        "/misc/src/hg/siti/trepalchi/bin/ipython",
        "kernel",
        "-f",
        "{connection_file}",
        "--ext",
        "django_extensions.management.notebook_extension"
    ],
    "display_name": "Trepalchi",
    "language": "python"
}

由于 buildout 是如何创建 ipython 脚本的,因此在我的情况下不需要添加环境变量。

正如 Rob 已经提到的,jupiterlab 仅安装在我使用以下命令启动它的一个环境中:

jupyter lab

不在 Django 项目环境中,我只安装 ipykernel(已经有 20 个依赖项)。

因为我往往有很多项目,所以我发现在我开始 jupyter lab 的地方有很多指向项目的链接是很有用的,这样我就可以轻松地找到它们。感谢 django_extension 提供的扩展,我不需要任何额外的单元来初始化笔记本。

可以使用以下命令找到以这种方式添加的任何单个内核:

jupyter kernelspec list

并在 jupyter lab 的启动器中明确列出