1. ホーム
  2. django

Django用のJupyter/IPython Notebookをセットアップするには?

2023-08-18 18:53:52

質問

で説明されている方法を使っています。 この投稿 で説明されている方法を使用しています。この方法の要点は、 DJANGO_SETTINGS_MODULE を設定する IPython 拡張を作り、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をうまく連携させるためにはどうしたらよいでしょうか?

UPDATEしました。 For @DarkLight - 私は Django 1.8.5 with 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()

どのように解決するのですか?

念のため(ただし2018年なので、この質問が投稿されてから状況が変わったかもしれません):実際にJupyter PythonカーネルをDjango環境にインストールすると、別のJupyterサーバ/環境(ウィジェット、拡張、テーマの変更などをインストールしたもの)に接続(下で実行)することが可能です。 django_extensions はまだ必要な作業の一部しかしていません :-)

これは、Django とは別の Jupyter 仮想環境を持っていて、そのカーネルや拡張が、 でインストールされていると仮定しています。 --user . すべての Jupyter 拡張(とその依存関係)は、Django のものの代わりにこの仮想環境にインストールされます(pandas や matplotlib などを Django のコードと一緒に使う必要がある場合は、Django 環境に必要なままです)。

Django の仮想環境 (バージョン 2 のインタプリタを含む、異なるバージョンの Python を実行可能) に、 ipython カーネルをインストールします。

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

これはユーザーのJupyterカーネルディレクトリに指定された --name のカーネル設定ディレクトリを作成します(Linuxでは ~/.jupyter/ であり、OSXでは ~/Library/Jupyter/ を含む) kernel.json ファイルと画像/アイコン (デフォルトでは、インストールするカーネル用のデフォルトの Jupyter アイコンが使用されます) が含まれています。このカーネルは、作成時にアクティブだった仮想環境内で実行され、Django プロジェクトで使用する python の全く同じバージョンと、インストールされた全てのモジュールを使用します。

実行中 ./manage.py shell_plus --notebook を実行すると非常に似たことができますが、現在のvenvにインストールされているすべてのもの(Jupyterサーバーとすべての拡張機能を含む)を必要とすることに加えて、プロジェクトのルートと異なるディレクトリのノートブックを実行することができません(プロジェクトのルートには ./manage.py ). さらに、仮想環境ではなく、パス上で最初に見つかった python と呼ばれる実行ファイルを使用してカーネルを実行するため、アクティブな Django 仮想環境内でコマンドラインから起動しない場合、動作がおかしくなります。

これらの問題を解決して、設定した任意の Django プロジェクトの内部で動作する Notebook を作成し、ファイルシステム上の任意の場所に保存された Notebook を実行できるようにするためには、次のようにする必要があります。

  1. 最初の 'argv' パラメータに、仮想環境に含まれる Python インタプリタのフルパスが含まれていることを確認する。
  2. シェル環境変数を含む 'env' セクションを (まだ存在しないなら) 追加し、 Python に我々のプロジェクトがどこで見つかるか、どの Django 設定を使うべきかを伝えるために、これらを使用します。これを行うには、以下のようなものを追加します。
   "env": {
      "DJANGO_SETTINGS_MODULE": "my_project.settings",
      "PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
   }

  1. optional: '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".My_project.Settings"。 : 通常はプロジェクトのmanage.pyにあるように、あなたの設定です。

  • "PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project".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".XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX; : カーネル実行の第一引数 (argv リスト) には、プロジェクトの仮想環境の python インタプリタのフルパスを指定します (これも django_extensions が間違っている点です。これを修正すれば、どのノートブックサーバでも特定の Django 環境のカーネルとそのインストール済みモジュールをすべて実行できるようになります)。

  • "django_extensions.management.notebook_extension"。 : これはノートブックの 'shell_plus' 機能を読み込むための拡張機能です (オプションですが便利です :-) )