`pip` と `conda` は何が違うのか?


背景

Anacondaの仮想環境で、pipが使えるにも拘らず、なぜcondaでインストールするのか?疑問に思い、使い分けがあるなら知りたいと思った。

pipconda の違い

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でインストールできない場合