web-dev-qa-db-ja.com

Django用にJupyter / IPython Notebookを設定するにはどうすればよいですか?

私は この投稿 で説明されている方法を使用して、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()
51
odedbd

完全を期すために(しかし、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プロジェクト内で実行するノートブックを作成し、ファイルシステムのどこにでも保存されているノートブックを実行できるようにするには、以下を行う必要があります:

  1. 最初の「argv」パラメーターに、仮想環境に含まれるpythonインタープリターへの絶対パスが含まれていることを確認してください
  2. シェル環境変数を含む「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プロジェクトディレクトリ内の任意の場所でノートブックを実行できるようにします)

  • "/ 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」機能をロードする拡張機能です(オプションですが便利です:-))

12
RobM
  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()
    
47
SeanB

私のためにちょうど働いたものはここにあります

  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. ジョンミーの答えのスクリーンショットに従って、ブラウザから新しい「Django Shell Plus」ノートブックを開きます。

および、重要なのは、ノートブック環境内からディレクトリを変更するdid n't作業が重要だったことです。 manage.py Shell_plus --notebookが実行されているディレクトリにないノートブックで作業しようとすると、カーネルが正しく構成されませんでした。私にとっては、ノートブックを一度に1つのディレクトリのみに構成することで十分でした。

†Dockerセットアップ(オプション)

  1. ポート8888のコンテナのポートマッピングを追加します

たとえば、Docker作成ファイルでは、

ports:
      -  "8890:8888"
  1. Ip 0.0.0.0を使用するようにプロジェクト設定ファイルを構成します

これは私がやったことです:

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

実際には、あなたは(そうでないかもしれない)そのすべてのがらくたをする必要があります。 Django-extensionsをインストールしてjupyterを実行するだけです!

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

ブラウザで、新しい「Django Shell-Plus」を開始します。 enter image description here

そして、あなたは行ってもいいはずです。例えば:

from myproject.models import Foobar
Foobar.objects.all()
9
John Mee

注:私はPython 3.7およびDjango 2.1を使用しています。Django 2.2。最初のセルで何も実行する必要はありません。これは、Djangoプロジェクトのルートにノートブックがあることを気にしない限り、これは魅力のように機能します。

仮想環境を持っているがプロジェクトであり、アクティブ化されていると想定されます。 pipenv を使用して仮想環境を作成し、pythonプロジェクトの依存関係を追跡しますが、使用するツールはユーザー次第です。

また、Djangoプロジェクトを作成済みであり、現在の作業ディレクトリがこのプロジェクトのルートであると想定されています。

手順

  1. jupyterをインストールします

    pipを使用する

    pip install jupyter
    

    pipenvを使用する

    pipenv install jupyter
    
  2. Django-extentionsをインストールします

    pipを使用する

    pip install Django-extensions
    

    pipenvを使用する

    pipenv install Django-extensions
    
  3. Django-extensionsを、DjangoプロジェクトINSTALLED_APPSファイルのsettings.py設定に追加してセットアップします。

    INSTALLED_APPS = (
        ...
        'Django_extensions',
    )
    
  4. Shell_plusの一部である Django-extensions 管理コマンドを実行します。ノートブックを起動するには、オプション--notebookを使用します。

    python manage.py Shell_plus --notebook
    

    Jupyter Notebookがブラウザーで自動的に開きます。

  5. 新しいDjango Shell-Plusノートブックを開始します

enter image description here

それでおしまい!


繰り返しますが、最初のセルで何も実行する必要はなく、dir()を実行して現在のローカルスコープの名前を確認することで確認できます。

enter image description here

編集:

ルートディレクトリの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
8
lmiguelvargasf

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にナビゲートし、first/topmyDjangoProject-を入力しますディレクトリ
  • First/topmyDjangoProject-ディレクトリ内で開始新しいJupyter noteboke: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)
    
2
pyano

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にインストールする必要があります。

2
Rafters

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のランチャーに明確にリストされています

0