ode*_*dbd 54 django ipython jupyter jupyter-notebook
我一直在使用这篇文章中描述的方法来设置IPython笔记本,以便与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
Run Code Online (Sandbox Code Playgroud)
随着最近升级到Jupyter笔记本电脑,这个设置现在已经打破了.我可以通过在笔记本的第一个单元格中添加类似的代码来在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()
Run Code Online (Sandbox Code Playgroud)
小智 49
django-extensions从https://github.com/django-extensions/django-extensions/blob/master/docs/index.rst安装
pip install django-extensions
Run Code Online (Sandbox Code Playgroud)更改您的设置文件以包含'django-extensions'
INSTALLED_APPS += ['django_extensions']
Run Code Online (Sandbox Code Playgroud)像这样运行你的Django服务器:
python manage.py shell_plus --notebook
Run Code Online (Sandbox Code Playgroud)改变以适应,并在你的第一个单元格中运行
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()
Run Code Online (Sandbox Code Playgroud)现在你应该能够导入你的django模型等了,例如:
from app.models import Foobar
Foobar.objects.all()
Run Code Online (Sandbox Code Playgroud)Rob*_*obM 12
只是为了完整性(但它是2018年,所以自从这个问题发布以来可能会发生变化):你可以在你的Django环境中安装一个Jupyter Python内核,然后连接(在其下运行)一个不同的Jupyter服务器/环境(你可以在那里)已安装小部件,扩展,更改主题等).django_extensions现在仍然只做部分工作:-)
这假设您有一个Jupyter虚拟环境,该环境与Django的虚拟环境分开,其内核/扩展安装在其中--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'
Run Code Online (Sandbox Code Playgroud)
这将创建一个内核配置目录,其中包含用户的Jupyter内核目录中指定的--name(在Linux上,它~/.jupyter/在OSX上~/Library/Jupyter/),其中包含kernel.json文件和images/icons(默认情况下,我们内核的默认Jupyter图标)重新安装使用).这个内核将在创建时活动的虚拟环境中运行,因此使用完全相同版本的python和我们的Django项目使用的所有已安装模块.
运行./manage.py shell_plus --notebook执行非常类似的操作,但除了要求安装在当前venv中的所有内容(包括Jupyter服务器和所有扩展)之外,它还无法在与项目根目录(包含的目录)不同的目录中运行笔记本./manage.py.此外,它将使用它在路径上找到的第一个名为python的可执行文件来运行内核,而不是虚拟环境的那个,这使得它在未从活动Django虚拟环境中的命令行启动时出现异常.
为了解决这些问题,我们能够创建一个在我们已经配置的任何Django项目中运行的Notebook,并且能够运行存储在文件系统中任何位置的笔记本,我们需要:
"env": {
"DJANGO_SETTINGS_MODULE": "my_project.settings",
"PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
}
Run Code Online (Sandbox Code Playgroud)
编辑这个环境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"
]
}
Run Code Online (Sandbox Code Playgroud)
显着的线条:
"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 list)应该是项目虚拟环境的python解释器的完整路径(这是另一件事django_extensions出错:修复此问题将允许任何笔记本服务器运行该特定Django环境的内核及其所有已安装的模块
"django_extensions.management.notebook_extension":这是将在笔记本中加载"shell_plus"功能的扩展(可选但很有用:-))
Mar*_*ian 11
这就是对我有用的东西
pip install jupytermkdir notebookscd notebooks../manage.py shell_plus --notebook
而且,重要的是,无法正常工作的是从笔记本环境中更改目录.如果我尝试使用任何不在manage.py shell_plus --notebook运行目录中的笔记本,那么内核配置不正确.对我来说,一次只为一个目录配置笔记本就足够了.
例如,在docker compose文件中;
ports:
- "8890:8888"
Run Code Online (Sandbox Code Playgroud)
这就是我做的:
NOTEBOOK_ARGUMENTS = [
'--ip', '0.0.0.0',
'--allow-root',
'--no-browser',
]
Run Code Online (Sandbox Code Playgroud)
lmi*_*asf 10
注意:我正在使用Python 3.7和Django 2.1,它适用于Django 2.2。我不必在第一个单元格中运行任何东西,只要您不介意将笔记本放在Django项目的根目录中,它就可以像魅力一样工作。
假定您的项目具有虚拟环境,并且已激活该环境。我曾经pipenv创建虚拟环境并跟踪我的python项目的依赖关系,但这取决于您使用哪种工具。
还假定您已经创建了Django项目,并且当前工作目录是该项目的根目录。
安装 jupyter
使用点
pip install jupyter
Run Code Online (Sandbox Code Playgroud)
使用pipenv
pipenv install jupyter
Run Code Online (Sandbox Code Playgroud)安装 django-extentions
使用点
pip install django-extensions
Run Code Online (Sandbox Code Playgroud)
使用pipenv
pipenv install django-extensions
Run Code Online (Sandbox Code Playgroud)设置django-extensions将其添加到INSTALLED_APPS您的Django项目的设置settings.py文件:
INSTALLED_APPS = (
...
'django_extensions',
)
Run Code Online (Sandbox Code Playgroud)运行的shell_plus一部分的管理命令django-extensions。使用该选项--notebook启动笔记本:
python manage.py shell_plus --notebook
Run Code Online (Sandbox Code Playgroud)
Jupyter Notebooks将在您的浏览器中自动打开。
启动一个新的Django Shell-Plus笔记本
而已!
同样,您不必在第一个单元格中运行任何内容,可以通过运行dir()以查看当前本地范围中的名称来佐证。
如果要将笔记本放在notebooks根目录下的目录中,可以执行以下操作:
$ mkdir notebooks && cd notebooks
$ python ../manage.py shell_plus --notebook
Run Code Online (Sandbox Code Playgroud)
感谢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
Run Code Online (Sandbox Code Playgroud)
事实证明你(可能不是)需要做所有的废话.只需安装django-extensions并运行jupyter!
(myprojectvenv)$ cd myproject
(myprojectvenv)$ pip install jupyter
(myprojectvenv)$ pip install django-extensions
(myprojectvenv)$ jupyter notebook
Run Code Online (Sandbox Code Playgroud)
在浏览器中,启动一个新的"Django Shell-Plus":

你应该好好去.例如:
from myproject.models import Foobar
Foobar.objects.all()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32124 次 |
| 最近记录: |