私は この投稿 で説明されている方法を使用して、Djangoでうまく動作するようにIPython Notebookをセットアップしています。メソッドの要点は、Django_SETTINGS_MODULEを設定し、IPythonの起動時にDjango.setup()を実行するIPython拡張機能を作成することです。
拡張機能のコードは次のとおりです。
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をうまく再生するにはどうすればよいですか?
UPDATE:@DarkLightの場合-Jupyter 1.0.0でDjango 1.8.5を使用しています。ノートブックで実行するコードは次のとおりです。
import os, sys
sys.path.insert(0, '/path/to/project')
os.environ.setdefault("Django_SETTINGS_MODULE", "settingsfile")
import Django
django.setup()
完全を期すために(しかし、2018年なので、この質問が投稿されてから状況が変わったかもしれません)、実際にJupyter PythonカーネルをDjango環境にインストールし、別のJupyterに接続(実行)できますサーバー/環境(ウィジェット、拡張機能のインストール、テーマの変更など)。 Django_extensions
現在、まだ必要な作業の一部のみを実行しています:-)
これは、Djangoの環境とは別のJupyter仮想環境があり、そのカーネル/拡張機能が--user
でインストールされていることを前提としています。すべてのJupyter拡張機能(およびそれらの依存関係)は、Djangoの1つではなく、このvenvにインストールされます(Django環境で[pandas]、matplotlibなどが必要な場合は、Djangoコード)。
Django仮想環境(バージョン2インタープリターを含む異なるバージョンのPythonを実行できる)で、ipythonカーネルをインストールします。
pip install -U ipykernel
ipython kernel install --user --name='environment_name' --display-name='Your Project'
これにより、指定した-–nameでカーネル構成ディレクトリが作成され、ユーザーのJupyterカーネルディレクトリ(Linuxでは~/.jupyter/
で、OSXでは~/Library/Jupyter/
)にkernel.jsonファイルとimages/iconsが含まれます。デフォルトでは、インストールするカーネルのデフォルトのJupyterアイコンが使用されます)。このカーネルは、作成時にアクティブだった仮想環境内で実行されるため、まったく同じバージョンのpythonとDjangoプロジェクトで使用されるすべてのインストール済みモジュールを使用します。
./manage.py Shell_plus --notebook
の実行は非常に似ていますが、現在のvenvにインストールされているすべて(Jupyterサーバーとすべての拡張機能を含む)を必要とすることに加えて、プロジェクトのルートとは異なるディレクトリ(ノートブックを含むもの)でノートブックを実行することもできません./manage.py
)。さらに、仮想環境のパスではなくパス上で検出されるpythonという最初の実行可能ファイルを使用してカーネルを実行し、アクティブなDjango仮想環境内のコマンドラインから起動しないと誤動作する。
これらの問題を修正して、そのように設定したDjangoプロジェクト内で実行するノートブックを作成し、ファイルシステムのどこにでも保存されているノートブックを実行できるようにするには、以下を行う必要があります:
"env": {
"Django_SETTINGS_MODULE": "my_project.settings",
"PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
}
この環境の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プロジェクトディレクトリ内の任意の場所でノートブックを実行できるようにします)
"/ home/projectuser/.pyenv/versions/2.7.15/envs/my_project_venv/bin/python":カーネル実行の最初の引数(argvリスト)、プロジェクトのフルパスである必要があります仮想環境のpythonインタープリター(これはDjango_extensionsが間違っているもう1つの問題です。これを修正すると、ノートブックサーバーがその特定のDjango環境のカーネルをインストールされたすべてのモジュールで実行できるようになります)
"Django_extensions.management.notebook_extension":これは、ノートブックの「Shell_plus」機能をロードする拡張機能です(オプションですが便利です:-))
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
合わせて変更し、最初のセルでこれを実行します
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モデルなどをインポートできるはずです。例:
from app.models import Foobar
Foobar.objects.all()
私のためにちょうど働いたものはここにあります
pip install jupyter
mkdir notebooks
cd notebooks
../manage.py Shell_plus --notebook
および、重要なのは、ノートブック環境内からディレクトリを変更するdid n't作業が重要だったことです。 manage.py Shell_plus --notebook
が実行されているディレクトリにないノートブックで作業しようとすると、カーネルが正しく構成されませんでした。私にとっては、ノートブックを一度に1つのディレクトリのみに構成することで十分でした。
たとえば、Docker作成ファイルでは、
ports:
- "8890:8888"
これは私がやったことです:
NOTEBOOK_ARGUMENTS = [
'--ip', '0.0.0.0',
'--allow-root',
'--no-browser',
]
実際には、あなたは(そうでないかもしれない)そのすべてのがらくたをする必要があります。 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()
注:私はPython 3.7およびDjango 2.1を使用しています。Django 2.2。最初のセルで何も実行する必要はありません。これは、Djangoプロジェクトのルートにノートブックがあることを気にしない限り、これは魅力のように機能します。
仮想環境を持っているがプロジェクトであり、アクティブ化されていると想定されます。 pipenv
を使用して仮想環境を作成し、pythonプロジェクトの依存関係を追跡しますが、使用するツールはユーザー次第です。
また、Djangoプロジェクトを作成済みであり、現在の作業ディレクトリがこのプロジェクトのルートであると想定されています。
jupyter
をインストールします
pipを使用する
pip install jupyter
pipenvを使用する
pipenv install jupyter
Django-extentions
をインストールします
pipを使用する
pip install Django-extensions
pipenvを使用する
pipenv install Django-extensions
Django-extensions
を、DjangoプロジェクトINSTALLED_APPS
ファイルのsettings.py
設定に追加してセットアップします。
INSTALLED_APPS = (
...
'Django_extensions',
)
Shell_plus
の一部である Django-extensions
管理コマンドを実行します。ノートブックを起動するには、オプション--notebook
を使用します。
python manage.py Shell_plus --notebook
Jupyter Notebookがブラウザーで自動的に開きます。
新しい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
Win10、Python 3.5、Django 1.10を使用すると、次のように機能します。
インストールDjangoおよびインストールDjango-extensions:
pip install Django
pip install Django-extensions
新しいDjangoプロジェクトを開始します。後でJupyterからアクセスできるディレクトリツリーのその部分でそれを行う必要があります。
Django-admin startproject _myDjangoProject_
Jypterを開始
次のコードを入力して実行します。
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)
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
次の2つの変更を加えるだけです。
1つ目は、"argv"
リストの最初の値を"python"
からpython仮想環境のDjangoバージョンの完全なアドレスに編集することです。例:"/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にインストールする必要があります。
RobMの非常に完全な answer に情報を追加します。これは buildout とdjangorecipe djangorecipe を使用する非常にまれな開発者の利益のためです。私は...私はjupyter labを使用していますが、すべての情報は古いjupyterノートブックに適用できると思います。
Buildoutを使用する場合、「manage.py」の代わりに「bin/Django」ハンドラーを使用します。これが、パス全体を定義するスクリプトです。 buildout.cfgにもう1つの部分を追加しました。
[ipython]
recipe = zc.recipe.Egg
eggs = ${buildout:eggs}
extra-paths = ${buildout:directory}/apps
initialization = import os
os.environ['Django_SETTINGS_MODULE'] = 'web.settings'
ipython
という名前の別のスクリプトが./bin
ディレクトリに作成されるようにします。 kernelspecにそのインタープリターを指定します。さらに、"-m", "ipykernel_launcher"
ではなくkernel
引数を使用するため、使用するカーネル定義は次のようになります。
{
"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は、次のコマンドで起動する1つの環境にのみインストールされます。
jupyter lab
Djangoプロジェクトの環境ではなく、ipykernel
(既に20個の依存関係がある)のみをインストールします。
私は非常に多くのプロジェクトを持っている傾向があるので、簡単にアクセスできるように、プロジェクトへの多くのリンクを持つjupyter lab
を開始する単一のポイントがあると便利です。 Django_extensionが提供する拡張機能のおかげで、ノートブックを初期化するのに余分なセルは必要ありません。
この方法で追加された単一のカーネルは、次のコマンドで見つけることができます。
jupyter kernelspec list
そして、jupyter labのランチャーに明確にリストされています