blogこの広告は、90日以上更新していないブログに表示しています。pipTweetAnaconda環境下でpipを使う場合のリスクについて、日本語で書かれたページがほとんど見つからなかったので覚え書き。(2019-09-27)予想以上にたくさんの方にこのエントリーを読んでいただけているようでありがとうございます。細かい表現を推敲したほか、Anacondaのドキュメントが全部リンク切れしていたので修正しました。SNS等での反応を見ていて一部誤解や認識違いがあるようなので後日補足エントリーを書こうと計画しています。余談なのですが、個人ブログの記事って結構怪しい情報が多いです。ググると個人ブログ(とか各国のQ&Aサイト)が上位に出てくることが多く、それを見て満足してしまうことも多いかと思いますが、(私の記事を含め)こういった個人ブログは鵜呑みにはせず、公式ドキュメントの情報も参考にしたほうが良いと思います*1。ひとことでAnaconda下でpipを使うと予期せず環境が破壊され、最悪の場合Anaconda自体の再インストールが必要になる。pipは慎重に使いましょう。condaとpippipはPython環境で様々なパッケージを管理するための標準ツール。numpyというコマンド一発で(依存関係も含め)PyPI(配布サイト)からnumpyをダウンロード・インストールすることができる。Inc.社の提供するAnacondaというPythonのディストリビューション。www.anaconda.comAnacondaにはcondaという独自のパッケージマネージャーが付属しており、仮想環境の管理やpipの代わりの役割などを果たしている。numpyからnumpyをインストールできる。(2013~2014年ぐらい)はPythonの公式側でパッケージ管理の仕組みがまだ整備途中の段階だった。Windowsではnumpyの様な(他言語で書かれたライブラリのコンパイルを伴う)パッケージをpipから入れるのは難しかった。そのため、非公式サイトからビルド済のファイルを逐一ダウンロードする必要があるなど不便が多かった。Anacondaではその辺の不便が解消されており、当時から一発で必要なパッケージをすべてインストールできた(今となっては大半のパッケージがpipで入れられるように整備されている)。condaの仕組みcondaとpipとでインストール等のコマンドはよく似ているのだが、両者のパッケージの仕組みは全く異なり、基本的に互換性が一切ない。condaでは複数の仮想環境下で同じパッケージをインストールする際、ハードリンクを利用することによって容量を節約している。これは大変便利な機能であるのだが、複数の仮想環境が完全に隔離されないというデメリットを有しており、特にbase環境を破壊してしまうと修復困難に陥る可能性がある。installコマンドが用いるAnaconda社のレポジトリからは提供されていない。そのような場合にとるべきアプローチはいくつかある。conda-forgeというチャネルには多数のパッケージがある。自分でconda用のパッケージを作る。pipを使ってインストールする。このうち最後の「pipを使ってインストール」をするとcondaとpipのパッケージが混ざって厄介なことになる可能性がある。*2pipを使って新たにパッケージをインストールする際、依存パッケージがcondaで既にインストールされている場合はあえて上書きされることは基本的にはない(はず)。(pip))等から予期せずcondaのパッケージが上書きされてしまうことがある*3。Pythonのパッケージは上書きされたところで問題が発生しない場合が多いのだが、コンパイル済みのライブラリを含んだパッケージ(例えばnumpy)ではパッケージ内外でのライブラリの依存関係がおかしくなり、パッケージの使用に支障を来す場合がたまにある*4。その結果、パッケージ1つのインストールでAnaconda環境が壊れてしまうことがある。これがAnacondaのデフォルト環境(base環境)の場合、Anacondaそのものを再インストールしない限り修復困難になってしまう。condaではハードリンクを用いて仮想環境間でパッケージを共有しているため、一つの環境でやらかしてしまったが最後、base環境を含んだ全ての仮想環境が破壊されることもある。PyQtの場合実際これが起こることが報告されている。faultで強制終了・クラッシュしてしまう。なってしまうとPyQtをpipやcondaで再インストールしても修復不可能になる場合がある。(以下のGitHub上のIssue参照)github.com繰り返しになるが、直接PyQt5をインストールしなくても、入れようとしたパッケージのrequirementsの中にPyQt5が入っていると依存関係を満たすために予期せずpipがパッケージを上書きしてしまう場合がある。パッケージが見つからなかった場合に安易にpipから入れるのは危険だということがわかる。リスクを減らすためには例えば次の様な手順を踏む(ちなみにAnaconda公式でもpipを使用する際の注意事項が挙げられている)。Xを提供しているチャネルがないか探す。X等の方法でインストールする(この場合もチャネルの優先順位など、様々な注意が必要。詳しくは公式ドキュメント参照)。conda-forgeというチャネルは比較的しっかりしているので、あればそれがおすすめ。Xを提供しているチャネルがなかった場合、pipから入れるのが現実的である。その場合、まずPyPIのサイトから該当するパッケージを探し、依存関係を調べておく。依存するパッケージのうち、condaからインストール可能なものはcondaを用いてインストールしておく。XでXをインストールし、動作確認する。installは一切用いない。installを用いないかというと、これをすると元のcondaの環境が(ハードリンクを通じて)汚染される可能性を排除できないから。Anacondaを使うのをやめる。Python公式サイトのPythonを使い、パッケージはpipで導入する。仮想環境についてはvenvやvirtualenvを用いる。同じパッケージがpip経由とconda経由で入っている場合重複して表示される。4.6.0以降のバージョンでは、condaのパッケージをpipで上書きしても重複表示されることがなくなったため、この方法は使えません)。ちなみに、このエントリーではcondaでインストール済みのパッケージをあえてpipで上書きしてしまうようなケース(これはポカミスと言って良いだろう)については言及していないが、その場合も同じような問題が発生する可能性がある。installは既存のファイルを上書きするときに何の警告も出さないし、インストールする前にどのパッケージが導入されるか確認する(dry-runに相当)ことも(おそらく)できない。condaだけ、pipだけを用いてもこの事象が発生する可能性がないわけではない。condaとpipを混ぜてしまった場合、両者が独立した異なる手段でパッケージングされていることから、問題が発生する可能性が高くなる。Readerのスナップショット機能を使ってpdfをPowerPointに取り込むと図が劣化する(ぼやける・にじむ)月別アーカイブはてなブログをはじめよう!onoz000さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。