👋

自作パッケージを任意のディレクトリにあるNotebookで常にimportできるようにする

2022/05/07に公開

概要

  • 今回,異なるディレクトリにある自作パッケージが.ipynbでimportできない問題を解決しました.
  • Dockerで作成しており,work以下のどのディレクトリでもimportできるようにしました.
  • コンテナをbuildしたときの手順を残しています.
  • ここまでするならpip化したほうが良いよってのはその通りなので,pip化の記事も追々書きたいと思います.

全ファイルについては,以下をご確認ください.
https://github.com/yuiki-iwayama/JupyterLab-Docker

前提知識

  • 基本的なdockerコマンド, docker-composeコマンドの使い方
  • JupyterLabの使い方

試行環境とファイル構成

  • M1 MacBook Pro
  • macOS Monterey 12.3.1
  • Docker Desktop 4.7.1 (for Mac)
  • ファイル構成
.
├── Dockerfile
├── docker-compose.yml
├── work
│    ├── mypackage
│    │      ├── __init__.py
│    │      └── test_module.py
│    └── test.ipynb
├── init.sh
└── import_path.pth

手順

手順概要

  1. Dockerfileを作成する
  2. import_path.pthを作成する
  3. init.shを作成する
  4. docker-compose.ymlを作成する
  5. コンテナをbuildする
  6. work以下に自作packageを作成する
  7. work以下のディレクトリで,自作パッケージを試しにimportしてみる

1. Dockerfileを作成する


まずは,Dockerfileを書いていきます.

Dockerfile
Dockerfile
FROM continuumio/anaconda3:latest

# 必要なパッケージを入れる.
RUN apt-get update && apt-get install -y --no-install-recommends \
    fonts-ipaexfont \
    bash-completion \
    vim

# Debianの設定
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

COPY import_path.pth /opt/conda/lib/python3.9/site-packages/import_path.pth

RUN apt-get autoremove -y \
  && apt-get clean
WORKDIR /work

COPY init.sh /usr/bin
CMD ["/bin/bash", "/usr/bin/init.sh"]
  • COPY import_path.pth /opt/conda/lib/python3.9/site-packages/import_path.pthでファイルシステムの中にimport_path.pthをコピーする[1]

2. import_path.pthを作成する


次に,import_path.pthを書いていきます.

import_path.pth
/work
  • 今回はwork以下を対象にするので,/workと記載する[2]

3. init.shを作成する


JupyterLabを起動するためのコマンドを記載するinit.shファイルを書いていきます.

init.sh
init.sh
#!/bin/bash

source /etc/bash_completion
jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=''
  • jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=''でJupyterLabが立ち上がる

4. docker-compose.ymlを作成する

コンテナを立ち上げるのに必要なdocker-compose.ymlを書いていきます.

docker-compose.yml
docker-compose.yml
version: "3.8"
services:
  notebook:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: "jupyterlab"
    ports:
      - 8888:8888
    restart: always
    volumes:
      - ./work:/work

5. コンテナをbuildする


Dockerコンテナをbuildできる環境もできたので,いよいよコンテナを立ち上げます.

  • $ docker-compose up -d --build
  • 立ち上がったら,ブラウザでlocalhost:8888にアクセスしてJupyterLabがうまく起動できているか確認する

6. work以下に自作packageを作成する


JupyterLabが立ち上がったので,work以下に自作packageを作ります.

  • $ cd work
  • $ mkdir mypackage
  • mypackageの下に__init__.pytest_module.pyを作ります[3]
__init__.py
__init__.py
from .test_module import *
test_module.py
test_module.py
import datetime as dt

TEST_TERM = "test"


def show_today():
    print(dt.date.today())


class Test:
  pass
  • 実際にJupyterLab側からmypackageが作られていることを確認できます

7. work以下のディレクトリで,自作パッケージを試しにimportしてみる


それでは,いよいよtest.ipynbでmypackageをimportしてみます.

  • import mypackageとimportした後に,定数,関数,クラスを呼び出せている事がわかります

参考

脚注
  1. */site-packagesに配置することが推奨されているとのことで,/opt/conda/lib/python3.9/site-packagesに配置しました. ↩︎

  2. 今回はwork以下を対象にしましたが,書き方次第でどのディレクトリに対して対応可能と思います. ↩︎

  3. 今回packageの概念については本題ではないので,Python init.pyの書き方とかを見ていただければと思います. ↩︎

Discussion