はじめに
Macbookを買い換えたのでPythonの開発環境を作り直すことになるのですが、ローカルに直接Pythonをインストールすると、ついうっかりglobalにパッケージをインストールしてしまったり、venvを使っていても環境を作り直したいときに一手間が面倒だったり、ということが嫌だったのでDockerを使って構築することにしました。
IntelliJにPluginインストール
IntelliJにDocker Pluginが入っていない場合は Preferences > Plugins
からインストールします。
Pythonプロジェクトの作成
次にIntelliJを立ち上げてPythonプロジェクトを作成します。
Dockerの必要なイメージはこの後作るので、ここではとりあえず適当なProject SDKを選んでおきます。(ここではPython2.7(venv)になっています)
それ以外はデフォルトのままで良くて、プロジェクトを作成します。
IntelliJ上でDockerfileを作成してイメージをビルドする
今回はPythonQiitaというプロジェクト名にしました。最初にPython環境をDockerイメージにしておく必要があるので、プロジェクトフォルダの直下にDockerfile
を作成します。(場所はどこでも良い)
Dockerfileにはベースとなるイメージファイル、初期設定コマンドなどを書いておきます。
今回はpython:3
イメージを使います。パッケージにpandas
numpy
を入れておきます。
作成したDockerfileを右クリックして、メニューからCreate Dockerfile
を選択します。
Configurationウィンドウが表示されるのでImage tag
を入力します。このタグ名は後で使います。ここではpython_qiita
としました。
Run built image
のチェックは外しておきます。これをオンにしておくと、イメージをビルドした後、コンテナとして起動してくれます。Container name
を入力すると、そのコンテナ名で起動するようになっています。
下記のから作成したDockerfile設定を起動すればイメージがビルドされます。Deploy Logに'python_qiita Dockerfile: Dockerfile' has been deployed successfully.
と出て完了したことが分かります。
イメージが作成されるとServicesビューにイメージ名が表示され、ビルドが成功したことが分かります。
ビルドしたイメージをProject SDKとして設定する
Dockerイメージがビルドできると、プロジェクトで利用するSDKとして利用できるようになります。コンテナはSDKにはならないので注意が必要です。
FIle > Project Structure
を開き、Project項目にあるNew
ボタンを押し、ポップアップにあるPython SDK
を選択します。
Python Interpreterを選択するウィンドウが表示されるので、左メニューにあるDocker
を選びます。すると、Image nameに先ほどビルドしたDockerイメージのタグ名が選択できるようになっていることを確認してOKボタンを押します。
Project StructureのSDKs項目にRemote Python 3.7.4 Docker...
が表示されており、packagesにDockerfileに書いたパッケージがインストールされていることが分かります。venvなどの環境では、ここでパッケージの追加・削除ができますが、DockerイメージのPythonだと追加・削除はできません。パッケージの構成が変わるたびにイメージをビルドしなおす必要があります。
Pythonの実行とデバッグ
ここまでくれば後は通常通りPythonファイルを作成して実行するだけですが、、、
設定を完了した直後だと、IntelliJがPythonの構成を適切に読み込めていないらしく、一度プロジェクトを閉じて開きなおす必要があります。さらに、画面下に下記のような更新中のインジケータが完了するまで待たないといけません。ここだけが難点です。仕組みはわかりませんが、改善されることに期待したいですね。
ここまで出来ればPythonのコード補完や実行、デバッグがIntelliJ上でできるようになっています。下記はpandasをインポートして実行した状態。
不便なこと
環境はDockerで構築できるのでポータブルになるし、気軽に作り直せることは実行環境面で非常に便利に感じます。一方で、いくつか不便に思うことがあるので書いておきます。
Dockerイメージをビルドしなおすと構成読み込みに時間がかかる
上述のSDKを設定した直後と同様に、イメージをビルドし直してPythonパッケージの構成を変えたとしても、すぐに反映されません。プロジェクトを再起動するなどして、IntelliJが再認識するのを待つ必要があります(数分)。
構成見直しが不要になってくると気になりませんが、プロジェクトの初期フェーズでは煩わしいです。
matplotlibなどのshow()
的なことができない
当たり前ですが、Docker上で実行するのでshow()
のようなウィンドウを立ち上げることができません。諦めてファイルに保存して確認するしかないです。
まとめ
紹介したような不便なところもありますが、環境も汚れないしポータブルであることは便利だと感じています。今までだと、パッケージの再構築が面倒だったり、requirements.txtのようなものに書きださなければならなかった環境が、Dockerfileにまとまるし、必要ならイメージをレポジトリで保存しておく事もできるのは良い感じだなと。
venvとどちらが楽か、と聞かれるとvenvだと思いますが、新しい環境で色々とやってみる方が今の自分の好みに合っているので、暫くはDockerで進めてみようと思います。