過去数日間のある時点で、MatplotlibはOS Xで動作しなくなりました。import matplotlib
をしようとしたときに表示されるエラーは次のとおりです。
Traceback (most recent call last):
File "/my/path/to/script/my_script.py", line 15, in <module>
import matplotlib.pyplot as plt
File "/Library/Python/2.7/site-packages/matplotlib/pyplot.py", line 34, in <module>
from matplotlib.figure import Figure, figaspect
File "/Library/Python/2.7/site-packages/matplotlib/figure.py", line 40, in <module>
from matplotlib.axes import Axes, SubplotBase, subplot_class_factory
File "/Library/Python/2.7/site-packages/matplotlib/axes/__init__.py", line 4, in <module>
from ._subplots import *
File "/Library/Python/2.7/site-packages/matplotlib/axes/_subplots.py", line 10, in <module>
from matplotlib.axes._axes import Axes
File "/Library/Python/2.7/site-packages/matplotlib/axes/_axes.py", line 22, in <module>
import matplotlib.dates as _ # <-registers a date unit converter
File "/Library/Python/2.7/site-packages/matplotlib/dates.py", line 126, in <module>
from dateutil.rrule import (rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY,
File "/Library/Python/2.7/site-packages/dateutil/rrule.py", line 14, in <module>
from six.moves import _thread
ImportError: cannot import name _thread
考えられる唯一のシステム変更は、AppleによるNTP更新と、おそらくBrewを再び動作させるために/ usr/localで行った許可の変更でした。
Pipを介してMatplotlibとPython-dateutilの両方を再インストールしようとしましたが、これは役に立ちませんでした。また、再起動を試みました。/usr/bin/pythonにあるPython 2.7.6を実行しています。 Yosemite(OS X 10.10.1)を実行しています。
Sudo pip uninstall python-dateutil
Sudo pip install python-dateutil==2.2
今日の午後にも同じエラーメッセージが表示されましたが、最近Yosemiteにアップグレードしました。 dateutilを以前のバージョンに戻すことがなぜうまくいくのか理解できませんが、上記を実行してから問題はありません(一般的にipythonノートブックでpyplotインラインを使用しています)。
この問題は、最新のsix
およびdateutil
バージョンで修正されています。ただし、OS Xでは、six
を最新バージョンに更新しても、実際には正しく更新されない場合があります。これは私に起こったことです:
pip2 install six -U
を実行した後、新しいsix
モジュールが/Library/Python/2.7/site-packages/
にインストールされました。ただし、python 2.7ターミナルにsix
をロードし、そのパスを確認したところ、次のようになりました。
import six
print six.__file__
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.pyc
したがって、pythonはsix
の古いバージョンを使用していました。
rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.*
これにより、この問題は修正されました。
python-dateutil==2.2
をインストールしてもうまくいきませんでした。
しかし、すばやい回避策はうまくいきました! python 2.7のsix.py
をpython 3.4(virtualenv)のsix.py
に置き換えます。以来、2.7では問題がありますが3.4では問題がありません。
UPDATE
pythonを再インストールした後(El Capitanにアップグレードした後)、同じ問題が再び発生しました。明らかなことは、このエラーはIPython
シェルとノートブック(import matplotlib.pyplot as plt
を実行するとき)でのみ発生するが、Pythonシェルでは正常に動作することです。
したがって、汚い回避策なしのより良い解決策(私の場合はうまくいきました)は、six
とipython
の両方を強制的にインストールすることです。これを修正するために私がしたことは次のとおりです:
$ pip install --ignore-installed six
$ pip install --ignore-installed ipython
インストールしたパッケージの完全にインストールされたバージョンを持っている可能性がありますが、デフォルトで使用されるバージョンは必要なバージョンではありません。次のように、パッケージを見つけるためにpythonが検索するパスのリストを見ることができます。
>>> import sys
>>> sys.path
pythonが最初に特定のパッケージの最新バージョンを検索できるようにするには、システムバージョンを削除する代わりに、〜/ .bash_profileでシステム変数PYTHONPATH
を設定します(またはlinuxの場合は〜/ .bashrc)新しいパッケージがインストールされているパスへの構成ファイル:
export PYTHONPATH=/Library/Python/2.7/site-packages
別の方法は、パスリストの先頭にパスを追加して、pythonスクリプト内のpythonパスを変更することです。
import sys
sys.path.insert(1,'/Library/Python/2.7/site-packages')
これは、特定のパッケージバージョンが必要なすべてのスクリプトに対して実行する必要があります。何らかの理由で、インストールした古いバージョンを使用したい場合があります。ところで、easy_install、pip、またはソースからのすべてのインストールは、/ Library/Python/2.7/site-packagesに移動します。これはEL Capitanで機能し、現在はmacOS Sierra(10.12.2)でも機能します