web-dev-qa-db-ja.com

OS XでのMatplotlibの問題(「ImportError:name _threadをインポートできません」)

過去数日間のある時点で、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)を実行しています。

77
Dolan Antenucci
Sudo pip uninstall python-dateutil
Sudo pip install python-dateutil==2.2

今日の午後にも同じエラーメッセージが表示されましたが、最近Yosemiteにアップグレードしました。 dateutilを以前のバージョンに戻すことがなぜうまくいくのか理解できませんが、上記を実行してから問題はありません(一般的にipythonノートブックでpyplotインラインを使用しています)。

191
wil3

この問題は、最新の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.*

これにより、この問題は修正されました。

45
Oriol Nieto

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シェルでは正常に動作することです。

したがって、汚い回避策なしのより良い解決策(私の場合はうまくいきました)は、sixipythonの両方を強制的にインストールすることです。これを修正するために私がしたことは次のとおりです:

$ pip install --ignore-installed six
$ pip install --ignore-installed ipython
10
Aziz Alto

インストールしたパッケージの完全にインストールされたバージョンを持っている可能性がありますが、デフォルトで使用されるバージョンは必要なバージョンではありません。次のように、パッケージを見つけるために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)でも機能します

10
Pablo Reyes