如何为Django设置Jupyter/IPython笔记本?

flvlnr44  于 2023-03-04  发布在  Go
关注(0)|答案(9)|浏览(133)

我一直在使用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 Notebook的第一个单元格中添加类似的代码来运行Django代码。但是,我无法弄清楚如何让Jupyter自动运行扩展,这样我就不必为我创建的每一个笔记本重复这样做了。
我该怎么做才能让 Django 和朱皮特玩得好?

**更新:**对于@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()
tvz2xvvm

tvz2xvvm1#

1.从https://github.com/django-extensions/django-extensions/blob/master/docs/index.rst安装django-extensions

pip install django-extensions

1.更改您的设置文件以包含'django-extensions'

INSTALLED_APPS += ['django_extensions']

1.像这样运行Django服务器:

python manage.py shell_plus --notebook

1.根据需要进行修改,然后在第一个单元格中运行此程序

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()

1.现在你应该可以导入你的django模型了。

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

tct7dpnv2#

为了完整起见(但现在是2018年,所以也许这个问题发布后情况发生了变化):实际上,你可以在Django环境中安装Jupyter Python内核,然后连接(运行)另一个Jupyter服务器/环境(你已经安装了小部件,扩展,更改了主题,等等)。django_extensions现在仍然只完成了所需工作的一部分:-)
这里假设你有一个独立于Django的Jupyter虚拟环境,它的内核/扩展都是用--user安装的。所有Jupyter扩展(以及它们的依赖项)都安装在这个venv中,而不是Django的(如果你需要和Django代码一起使用,你仍然需要panda,matplotlib等)。
在Django虚拟环境中(可以运行不同版本的Python,包括版本2解释器)安装ipython内核:

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

这将在用户的Jupyter内核目录中创建一个具有指定--name的内核配置目录(在Linux上,它 * 是 * ~/.jupyter/kernels,但在2023年变成了~/.local/share/jupyter/kernels/,而在OSX上,它是~/Library/Jupyter/kernels),包含其kernel.json文件和图像/图标(默认情况下,我们安装的内核使用默认的Jupyter图标).这个内核将在创建时处于活动状态的虚拟环境中运行,因此使用了与Django项目完全相同的python版本和所有已安装的模块。
运行./manage.py shell_plus --notebook执行的操作非常类似,但除了需要所有内容之外(包括Jupyter服务器和所有扩展),它也无法在项目根目录以外的目录中运行笔记本(包含./manage.py的那个)。另外,它将使用在路径中找到的第一个名为python的可执行文件来运行内核,而不是虚拟环境的一个,使得它在一个活跃的Django虚拟环境中不从命令行启动时行为不当。
为了解决这些问题,使我们能够创建一个在任何Django项目中运行的Notebook,并且能够运行存储在文件系统上任何地方的Notebook,我们需要:
1.确保第一个'argv'参数包含虚拟环境中包含的python解释器的完整路径
1.添加(如果还没有的话)一个包含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设置模块”:“我的项目设置”:设置,通常在项目的www.example.com中显示manage.py
*“Python路径”:“$PYTHONPATH:/主目录/项目用户/项目文件夹/我的项目”:PYTHONPATH被扩展为包含项目的主目录(包含www.example.com的目录manage.py),这样即使内核不在该目录下运行,也可以找到设置(这里django_extensions将使用一个通用的python,从而运行错误的虚拟环境,除非整个Jupyter服务器都从其中启动:将其添加到由django_extensions创建的kernel.json中,将使其能够在Django项目目录中的任何地方运行笔记本)
*"/home/项目用户/.pyenv/版本/2.7.15/环境/我的项目版本/bin/python”:内核执行的第一个参数(argv list)应该是项目虚拟环境的python解释器的完整路径(这是django_extensions的另一个错误:修复此问题将允许任何笔记本服务器运行特定Django环境的内核及其所有安装的模块)
*“django扩展管理笔记本扩展”:这是将在笔记本中加载“shell_plus”功能的扩展(可选但有用:-))

h9vpoimq

h9vpoimq3#

以下是刚刚对我有效的方法

  1. install Django Extensions(我使用了1.9.6)与其他答案一致
    1.安装木星
    pip install jupyter
    1.我在Docker容器中安装Jupyter时做的一些事情--如果适用于您,请参见下面的内容†
    1.从你的Django基本目录,创建一个笔记本目录,例如
    mkdir notebooks
    1.转到该目录
    cd notebooks
    1.从目录中启动django扩展shell_plus:
    ../manage.py shell_plus --notebook
    笔记本服务器现在应该正在运行,并且可能会启动新的浏览器。如果它没有启动浏览器窗口,请按照说明粘贴链接或令牌。
    1.从浏览器,打开一个新的“DjangoShellPlus”笔记本,根据JohnMee的答案截图

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

†坞站设置(可选)

1.为端口8888添加容器的端口Map
例如,在Docker合成文件中;

ports:
      -  "8890:8888"

1.将项目设置文件配置为使用ip0.0.0.0
我是这么做的:

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

vptzau2j4#

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

假设你的项目有一个虚拟环境,并且它是激活的,我使用pipenv来创建虚拟环境和跟踪我的python项目的依赖关系,但是这取决于你使用什么工具。
同时假设 * 您已经创建了一个Django项目 * 并且您的 * 当前工作目录是这个项目的根目录 *。
步骤
1.安装jupyter

    • 使用管道**
pip install jupyter
    • 使用pipenv**
pipenv install jupyter

1.安装django-extentions

    • 使用管道**
pip install django-extensions
    • 使用pipenv**
pipenv install django-extensions

1.通过将django-extensions添加到Django项目settings.py文件的INSTALLED_APPS设置来设置django-extensions

INSTALLED_APPS = (
    ...
    'django_extensions',
)

1.运行django-extensions中的shell_plus管理命令。使用选项--notebook启动笔记本:

python manage.py shell_plus --notebook

Jupyter Notebooks将在您的浏览器中自动打开。
1.开始新的Django Shell-Plus笔记本

就是这样!
同样,您不必在第一个单元格中运行任何内容,并且可以通过运行dir()查看当前本地作用域中的名称来进行确认。

编辑:

如果要将笔记本放在根目录下名为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
r9f1avp5

r9f1avp55#

实际上你(* 可能不需要 *)需要做所有这些废话。只要安装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()
zour9fqk

zour9fqk6#

虽然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交互。任何包,如panda,都需要安装在Django venv中。

h79rfbju

h79rfbju7#

下面的代码对我来说在win10,Python 3.5,Django 1.10中是有效的:

  • 将Python与Anaconda发行版一起安装,以便同时安装Jupyter
  • 安装Django并安装django-extensions
pip install Django

pip install django-extensions
  • 启动一个新的Django项目。你必须在Jupyter稍后可以访问的目录树中的那部分完成。
django-admin startproject _myDjangoProject_
  • 启动Jypter
  • 导航Jupyter到目录 myDjangoProject 并输入第一个/top myDjangoProject-目录
  • 在第一个/top myDjangoProject-目录中启动一个新的Jupyter笔记本:* 新--〉Django shell -加 *
  • 输入并运行以下代码:
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)
qfe3c7zg

qfe3c7zg8#

运行此命令。

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

pb3s4cty9#

我将添加一些信息到非常完整的answer的RobM,为非常罕见的开发人员的利益,使用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"
}

由于ipython脚本是由buildout创建的,因此在我的例子中不需要添加环境变量。
正如Rob已经提到的,jupiterlab只安装在一个环境中,我使用以下命令启动它:

jupyter lab

不是在Django项目的环境中,我只安装了ipykernel(已经有20个依赖项了)。
因为我有很多项目,所以我发现在jupyter lab的启动点设置很多项目链接是很有用的,这样我就可以很容易地访问它们。多亏了django_extension提供的扩展,我不需要任何额外的单元格来初始化笔记本。
任何以这种方式添加的单个内核都可以通过以下命令找到:

jupyter kernelspec list

清楚地列在木星实验室的发射器上

相关问题