pipでライブラリのバージョンを指定してインストール

pipでライブラリのバージョンを気軽にあげていたら、動かなくなるものが出たので戻し作業をやりました。
良い機会なので、pipで指定したバージョンのライブラリをインストールする方法を紹介します。

方法は、ドキュメントの、examplesの中にあるように、ライブラリ名の後ろに==でつなげてバージョンを指定するだけです。
pip install – examples

ちなみに、今回動かなくなったのは statsmodels です。(バージョンを上げたのはscipy)


# 動かなくなったコード。 ただのインポートさえできなくなった。
import statsmodels.api as sm

# 出力されたエラー
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
 in ()
      1 import numpy as np
      2 import matplotlib.pyplot as plt
----> 3 import statsmodels.api as sm

~/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/statsmodels/api.py in ()
     14 from . import robust
     15 from .robust.robust_linear_model import RLM
---> 16 from .discrete.discrete_model import (Poisson, Logit, Probit,
     17                                       MNLogit, NegativeBinomial,
     18                                       GeneralizedPoisson,

~/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/statsmodels/discrete/discrete_model.py in ()
     43 
     44 from statsmodels.base.l1_slsqp import fit_l1_slsqp
---> 45 from statsmodels.distributions import genpoisson_p
     46 
     47 try:

~/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/statsmodels/distributions/__init__.py in ()
      1 from .empirical_distribution import ECDF, monotone_fn_inverter, StepFunction
----> 2 from .edgeworth import ExpandedNormal
      3 from .discrete import genpoisson_p, zipoisson, zigenpoisson, zinegbin

~/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/statsmodels/distributions/edgeworth.py in ()
      5 import numpy as np
      6 from numpy.polynomial.hermite_e import HermiteE
----> 7 from scipy.misc import factorial
      8 from scipy.stats import rv_continuous
      9 import scipy.special as special

ImportError: cannot import name 'factorial'

statsmodelsがインポートできないので、statsmodelsを疑ってしまいそうですが、
根本的な原因は、scipyから、 factorialをインポートできなかったことでした。

----> 7 from scipy.misc import factorial

最近、scipyのバージョンを 1.1.0から 1.3.0 へ上げたのが怪しいです。
真の原因は何か他にありそうな気もするのですが、とりあえずscipy のバージョンを戻します。

戻し手順は最初に対象のライブラリをアンインストールした後に、再度バージョン指定してインストールです。


$ pip uninstall scipy
Uninstalling scipy-1.3.0:
# --- 略 ---
Proceed (y/n)? y
  Successfully uninstalled scipy-1.3.0

$ pip install scipy==1.1.0
# --- 略 ---
Installing collected packages: scipy

これでscipyのバージョンが戻り、再びstatsmodelsをimport できるようになりました。

pipでライブラリをアップデートする

pipの使い方メモです。

まず、インストール済みのパッケージについての情報は pip list で確認できます。
更新版があるパッケージのみ出力するオプションは -o または --outdatedです。


$ pip list --outdate
Package Version Latest Type
------------------ --------- ---------- -----
alabaster 0.7.11 0.7.12 wheel
astroid 2.0.4 2.1.0 wheel
astropy 3.0.4 3.1.1 wheel
beautifulsoup4 4.6.3 4.7.1 wheel
bleach 2.1.4 3.1.0 wheel
bokeh 0.13.0 1.0.4 sdist
certifi 2018.8.24 2018.11.29 wheel
click 6.7 7.0 wheel
~~~ 以下略 ~~~

アップデートしたいパッケージを決めたら、
pip install に、
 -U か --upgrade のどちらかのオプションをつけてパッケージを指定し実行するとアップデートできます。

例:


$ pip install --upgrade scikit-learn

Mac(Mojave) に pip で mecab-python3をインストールする時にはまった

環境
MacOS Mojave 10.14.2 (OS)
mecab-python3==0.996.1 (入れようとしたライブラリ)

本当はサクッとインストールして使い方について説明するはずだったのに、非常に苦戦したので記録しておきます。
MeCabをpythonから使うために、mecab-python3をインストールしようとしました。
コマンドはサイトに書いてある通り、こちらです。


pip install mecab-python3

これ、自分のや職場のPC,クラウド環境など、過去にいろんな環境で実行してきましたが、今回初めて失敗しました。

まず最初のエラーは、swig が入ってないとのことだったので、Homebrewで入れます。


brew install swig

この後再実行すると、別のエラー。しかもかなりの長文が出て失敗しました。
問題の箇所を抜粋したのがこちらです。


  warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
  MeCab_wrap.cpp:3051:10: fatal error: 'stdexcept' file not found
  #include 
           ^~~~~~~~~~~
  1 warning and 1 error generated.
  error: command 'gcc' failed with exit status 1

なにかのheaderがないと言われています。
これについて調べた結果、ネット上各所に command Line Toolsの
最新バージョンが問題であると指摘がありました。
ということで、command Line Toolsのバージョンを落とします。
こちらにアクセス
https://developer.apple.com/download/more/

どこまで古いバージョンなら良いのか確信が持てませんでしたが、
試しにXcode 9.4 向けのdmgファイルをダウンロードしてインストールしました。
その後、改めて最初のpipコマンドを打つと無事にpythonからMeCabが使えるようになりました。