LoginSignup
20

More than 3 years have passed since last update.

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

Posted at

背景

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20