【问题标题】:How do I set up Jupyter/IPython Notebook for Django?如何为 Django 设置 Jupyter/IPython Notebook?
【发布时间】:2016-05-30 17:29:41
【问题描述】:

我一直在使用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 没有问题。我会尽快根据您提出的信息更新问题。

标签: django jupyter-notebook ipython jupyter


【解决方案1】:

运行此命令。

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

【讨论】:

    【解决方案2】:

    这就是对我有用的东西

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

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

    † Docker 设置(可选)

    1. 为你的容器添加一个端口映射到 8888 端口

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

    ports:
          -  "8890:8888"
    
    1. 将项目设置文件配置为使用 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 部分对我来说很关键,谢谢!
    【解决方案3】:

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

    安装:

     pip install django-extensions
    

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

     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 中。

    【讨论】:

      【解决方案4】:

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

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

      还假设你已经创建了一个 Django 项目并且你的当前工作目录是这个项目的根目录

      步骤

      1. 安装jupyter

        使用点子

        pip install jupyter
        

        使用 pipenv

        pipenv install jupyter
        
      2. 安装django-extentions

        使用点子

        pip install django-extensions
        

        使用 pipenv

        pipenv install django-extensions
        
      3. 通过将django-extensions 添加到您的Django 项目settings.py 文件的INSTALLED_APPS 设置中来设置django-extensions。:

        INSTALLED_APPS = (
            ...
            'django_extensions',
        )
        
      4. 运行shell_plus 管理命令,它是django-extensions 的一部分。使用选项--notebook 启动笔记本:

        python manage.py shell_plus --notebook
        

        Jupyter Notebooks 将在您的浏览器中自动打开。

      5. 启动一个新的 Django Shell-Plus 笔记本

      就是这样!


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

      编辑:

      如果你想把你的 notebook 放在根目录下名为 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 保存在应用程序的目录中,并从 root 运行 python manage.py shell_plus --notebook,导致错误 myproject module not found 并且笔记本无法正常工作,遵循建议我从目录python ../../manage.py shell_plus --notebook 现在一切正常 - 谢谢! @Imiguelvargasf
      【解决方案5】:

      我将在 RobM 的非常完整的 answer 中添加一些信息,以造福于像我一样使用 buildout 和 djangorecipe djangorecipe 的极少数开发人员......我指的是 jupyter lab使用它,但我认为所有信息都可以应用于旧的 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的启动器中明确列出

      【讨论】:

        【解决方案6】:

        只是为了完整性(但现在是 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/)中创建一个具有指定名称的内核配置目录,其中包含其 kernel.json 文件和图像/图标(默认情况下使用我们正在安装的内核的默认 Jupyter 图标)。该内核将在创建时处于活动状态的虚拟环境中运行,因此使用完全相同版本的 python 以及我们的 Django 项目使用的所有已安装模块。

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

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

        1. 确保第一个“argv”参数包含虚拟环境中包含的 python 解释器的完整路径
        2. 添加(如果尚未存在)包含 shell 环境变量的“env”部分,然后使用这些告诉 Python 在哪里可以找到我们的项目以及它应该使用哪些 Django 设置。为此,我们添加如下内容:
           "env": {
              "DJANGO_SETTINGS_MODULE": "my_project.settings",
              "PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
           }
        
        1. 可选:将“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 创建的 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/…
        【解决方案7】:
        1. https://github.com/django-extensions/django-extensions/blob/master/docs/index.rst 安装django-extensions

           pip install django-extensions
          
        2. 更改您的设置文件以包含“django-extensions”

           INSTALLED_APPS += ['django_extensions']
          
        3. 像这样运行你的 Django 服务器:

          python manage.py shell_plus --notebook
          
        4. 改变以适应,并在您的第一个单元格中运行它

          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()
          
        5. 现在您应该可以导入您的 django 模型等,例如:

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

        【讨论】:

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

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

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

        在浏览器中,启动一个新的“Django Shell-Plus”:

        你应该很高兴。例如:

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

        【讨论】:

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

        以下对我使用 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-目录
        • 在第一个/顶部 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

        • 现在您可以从示例开始,例如:

          from django.template import Template, Context
          
          template = Template('The name of this project is {{ projectName }}')
          context = Context({'projectName': 'MyJypyterDjangoSite'})
          template.render(context)
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-22
          • 2017-09-23
          相关资源
          最近更新 更多