簡體   English   中英

OS X上的Matplotlib問題(“ ImportError:無法導入名稱_thread”)

[英]Matplotlib issue on OS X (“ImportError: cannot import 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更新,也許我在/ usr / local中進行了一些權限更改,以使Brew重新工作。

我嘗試通過Pip重新安裝Matplotlib和Python-dateutil,但這沒有幫助。 還嘗試了重啟。 我正在運行/ usr / bin / python中的Python 2.7.6。 我正在運行優勝美地(OS X 10.10.1)。

sudo pip uninstall python-dateutil
sudo pip install python-dateutil==2.2

盡管我最近升級到優勝美地,但今天下午我也收到了同樣的錯誤消息。 我不太確定我是否理解為什么將dateutil還原到以前的版本對我有用,但是由於運行上述命令,我沒有遇到任何麻煩(我通常在ipython筆記本中使用pyplot inline)。

最新的sixdateutil版本中已解決此問題。 但是,在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對我不起作用。

但是,一種快速而又骯臟的解決方法確實有效! 我更換six.py在Python 2.7與six.py蟒蛇3.4(virtualenv中)。 從那以后,我在2.7中遇到了問題,但沒有3.4。

更新

重新安裝python之后(升級到El Capitan之后),我又遇到了同樣的問題。 不明顯的是,此錯誤僅在IPython Shell和筆記本中發生(當我import matplotlib.pyplot as plt ),但在Python Shell中可以正常工作。

因此,一個更好的解決方案(在我的情況下確實有效)且沒有不可行的解決方法是強制同時安裝sixipython 這是我修復此問題的方法:

$ pip install --ignore-installed six
$ pip install --ignore-installed ipython

您可能已經完美安裝了所有已安裝軟件包的版本,但是默認情況下使用的不是您想要的版本。 您可以查看python搜索的路徑列表,以查找其包,如下所示:

>>> import sys
>>> sys.path

為了讓python首先搜索某些軟件包的最新版本,而不是刪除系統版本,可以做的是在〜/ .bash_profile(如果是linux,則為〜/ .bashrc)配置文件中設置系統變量PYTHONPATH 。到安裝新軟件包的路徑:

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)中也有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM