👋
自作パッケージを任意のディレクトリにあるNotebookで常にimportできるようにする
概要
- 今回,異なるディレクトリにある自作パッケージが
.ipynb
でimportできない問題を解決しました. - Dockerで作成しており,work以下のどのディレクトリでもimportできるようにしました.
- コンテナをbuildしたときの手順を残しています.
- ここまでするならpip化したほうが良いよってのはその通りなので,pip化の記事も追々書きたいと思います.
全ファイルについては,以下をご確認ください.
前提知識
- 基本的な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
手順
手順概要
- Dockerfileを作成する
- import_path.pthを作成する
- init.shを作成する
- docker-compose.ymlを作成する
- コンテナをbuildする
- work以下に自作packageを作成する
- 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__.py
とtest_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した後に,定数,関数,クラスを呼び出せている事がわかります
参考
-
*/site-packages
に配置することが推奨されているとのことで,/opt/conda/lib/python3.9/site-packages
に配置しました. ↩︎ -
今回は
work
以下を対象にしましたが,書き方次第でどのディレクトリに対して対応可能と思います. ↩︎ -
今回packageの概念については本題ではないので,Python init.pyの書き方とかを見ていただければと思います. ↩︎
Discussion