condaとpip:ver. 2020

要約

  • condaの仮想環境機能は改善しており、信頼して使えるようになった
  • condaとpipの競合についても改善しているが、依然としてケアは必要

 

はじめに

今から2年半ほど前、「condaとpip:混ぜるな危険」という記事を書きました。

onoz000.hatenablog.com当時はこういった詳細が日本語の記事になっていなかったのですが、あれから大分時間が経ち、日本語での情報も増えてきているようです(例:conda pip - Google 検索)。

ただ、2年以上経ったこともあり、最近では状況が変わってきているとの情報も目にしました。特にcondaとpipの共存に関しては、もはや危険ではないという意見もあるようです。

今回の記事は以前の記事から2年半でどれくらい状況が変わったのかについて調査した結果になります。

※ただし、私はここ数年Anaconda (conda)を使っていないため、誤解や間違いがあるかもしれません。その場合はコメント等で指摘いただければできる限り反映させます。

ハードリンクによる仮想環境破壊は対応済み

以前も指摘したように、condaのパッケージは仮想環境間でハードリンクを用いてファイルを共有しているため、一つの仮想環境下でcondaパッケージをpipが上書きすると別の環境に影響が及ぶという問題がありました。

これに関しては私が記事を書いたのと同じ頃にconda側でも問題になり、ほどなくしてAnaconda同梱のpipにパッチを当てる形で対応されました。具体的には、pipが書き込もうとするファイルが既に存在する場合、その前に該当するファイルを削除し、直接の上書きがなされないようにされました。ちなみに、その後pip本家でも別の問題に対応するために同様の変更がなされています(→Anaconda側でのパッチは不要に)。

この修正のお陰で一つの環境内でパッケージが競合してしまっても別の仮想環境まで影響が「染み出す」ことがなくなったので、pip/conda競合の厄介さは現在ではかなり和らいでいると思います。

(ハードリンクでパッケージを共有するという仕組み自体は変わっていないので、ある環境下のファイルを手動でいじった場合に他の環境にも影響が及ぶことは今でもありえます。)

condaとpipの共存は改善している(が、完全ではない)

conda 4.6.0の機能改善

2019年6月にリリースされたconda 4.6.0より、pipとcondaの相互運用性を改善する機能が追加されています。ただし、この機能はデフォルトでは無効のようです。

With this interoperability, conda can use pip-installed packages to satisfy dependencies, cleanly remove pip-installed software, and replace them with conda packages when appropriate.

 この説明だけでは正直何が変わって何ができるようになったのかよく分からないのですが、少なくともAnaconda側にpipとの運用性を良くする意図はあるようです。

それとは別に、conda 4.6.0以降ではconda listコマンドでパッケージ一覧を表示した際、pipとcondaのパッケージを重複して表示することはなくなったようです

conda側のpipに対するスタンス

conda環境でのpipの使用について、conda側は次のように言及しています

Issues may arise when using pip and conda together.

 「問題がおきることがあるかもしれないです」という何とも歯切れの悪い表現になっています。そして、pipを使用する際の推奨事項として、次のようなことを挙げています(詳細はリンク先を読んでください)。

  • pipはcondaの後にしか使わない(pip後にcondaを使わない)
  • 仮想環境を使う
  • (condaコマンドで)追加の変更をしたくなったら、環境を作り直す
  • パッケージのリストを保管しておく

概ね私が以前書いた記事と似た内容ですが、conda環境の隔離性が改善されたため、より仮想環境が安全に使えるようになっているのが当時との違いだと思います。

別のページでは、次のように述べています。

If you still cannot install the package, you can try installing it with pip. The differences between pip and conda packages cause certain unavoidable limits in compatibility but conda works hard to be as compatible with pip as possible.

conda側のスタンスとしては「conda環境下ではpipを使えないことはないが、色々とケアが必要なため可能な限りcondaを使ってくれ」ということなのでしょう。

その他、分からなかったこと

  • conda 4.6.0での改善の具体的な中身(重複して表示されないのは単に表示されないだけなのか、それとも別に何か処理をしているのか、など)
  • conda環境下でpipを用いた際、依存パッケージがどのように扱われるか、意図せずcondaパッケージが上書きされてしまうことがどれくらい発生するか
  • condaのroot環境がおかしくなってしまった場合の修復方法(root環境はあとから作った仮想環境とは違って簡単にリセットすることができない)