背景
Anacondaの仮想環境で、pipが使えるにも拘らず、なぜcondaでインストールするのか?疑問に思い、使い分けがあるなら知りたいと思った。
pip
と conda
の違い
StackOverflowやanacondaブログにわかりやすく書かれていた。
https://stackoverflow.com/questions/20994716/what-is-the-difference-between-pip-and-conda
https://www.anaconda.com/understanding-conda-and-pip/
1. Pythonで書かれたライブラリ以外を、インストールできるか否か
- pip の場合、Pythonのみで作られたパッケージだけ、インストールができる。
- 例えばHDF5やLLVMなど、C/C++やR言語で書かれたライブラリが必要なら、別途インストールする必要がある。
- conda の場合、Python以外の言語で作られたパッケージも、インストールできる。
- NumPyやMatplotlibなど、pipでPyPIからインストールする際にはビルドが必要だったライブラリも、condaなら、Anaconda Cloudからビルド済み媒体をインストールできる。
- 例えば PostgreSQLだって、condaでインストールして動かせる!(後述)
- 逆に、pipがサポートするwheel形式の媒体はcondaでインストールできない。これはpipを使ってインストールすることになる。
2. 仮想環境を作れるか否か
- pip だけでは、作れない。
- 例えばvirtualenvやpipenvなど、他のツールの力を借りて実現する必要がある。
- conda だけで、作れる。
- 作られた仮想環境にpipをインストールすれば、pipも使える。
3. ライブラリの互換性をチェックするか否か
- pip の場合、互換性をチェックせず、順番にインストールを試みる。
- インストールする順番によっては、互換性が保たずインストールしてしまい、環境を壊してしまう場合がある。
- conda の場合、互換性をチェックし、結果を教えてくれる。
- インストールするパッケージの依存ライブラリ関連メタ情報が正しい限り、condaが環境を壊さないよう注意してくれる。
condaで、PostgreSQLをインストールしてみた
試しに、anacondaでPostgreSQLをインストールして、接続してみる。
参考にしたgistはこちら。
https://gist.github.com/gwangjinkim/f13bf596fefa7db7d31c22efd1627c7a
仮想環境作成
$ conda create --name myenv
# enter the environment
$ conda activate myenv
PostgreSQLインストール
$ conda install -y -c conda-forge postgresql
PostgreSQL初期化
mylocal_db
フォルダをデータフォルダとして、初期化を行う。
$ initdb -D mylocal_db
...
Success. You can now start the database server using:
pg_ctl -D mylocal_db -l logfile start
PostgreSQL起動
早速起動してみる。付与したオプションにより、以下の様な動作となっている。
- データフォルダ(
-D
)は、初期化したmylocal_db
フォルダ - ログファイル(
-l
)は、logfile
に出力する - オプション(
-o
)として、5433番ポート(-p 5433
)を利用する。
$ pg_ctl -D mylocal_db -l logfile -o "-p 5433" start
waiting for server to start.... done
server started
PostgreSQLへ接続
psqlコマンドを実行することで、SQLを実行できる状態になる。
$ psql -d postgres -p 5433
psql (11.2)
Type "help" for help.
postgres=#
PostgreSQL停止
起動コマンド(pg_ctl start)と同じ要領で、停止コマンド(pg_ctl stop)を実行する。
$ pg_ctl -D mylocal_db -l logfile -o "-p 5433" stop
waiting for server to shut down.... done
server stopped
結局、使い分けは?
condaによるインストールのほうが便利なケースとして、以下があると理解したつもり。
- Numpyなど、インストール時にC/C++で環境ごとにビルドが必要なライブラリを利用する場合
- PostgreSQLなど、他のミドルウェアの利用が前提にある場合
- Dockerを持ち出さずとも、Anaconda1つですべてが完結する開発環境になるかな(?)
逆に、pipの方が便利なケースもありそう。多くはこちらか?
- 純粋なPython実装をしたい場合
- 利用するミドルウェアが、condaでインストールできない場合