在使用.yml文件重現(xiàn)某conda環(huán)境后,運(yùn)行環(huán)境內(nèi)程序出現(xiàn)報(bào)錯(cuò):
Traceback (most recent call last): File "./IntroMap.py", line 53, in <module> import matplotlib.pyplot as plt File "/home/bcl/miniconda3/envs/IntroMap/lib/python2.7/site-packages/matplotlib/pyplot.py", line 115, in <module> _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup() File "/home/bcl/miniconda3/envs/IntroMap/lib/python2.7/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup globals(),locals(),[backend_name],0) File "/home/bcl/miniconda3/envs/IntroMap/lib/python2.7/site-packages/matplotlib/backends/backend_qt4agg.py", line 18, in <module> from .backend_qt5agg import FigureCanvasQTAggBase as _FigureCanvasQTAggBase File "/home/bcl/miniconda3/envs/IntroMap/lib/python2.7/site-packages/matplotlib/backends/backend_qt5agg.py", line 16, in <module> from .backend_qt5 import QtCore File "/home/bcl/miniconda3/envs/IntroMap/lib/python2.7/site-packages/matplotlib/backends/backend_qt5.py", line 26, in <module> import matplotlib.backends.qt_editor.figureoptions as figureoptions File "/home/bcl/miniconda3/envs/IntroMap/lib/python2.7/site-packages/matplotlib/backends/qt_editor/figureoptions.py", line 20, in <module> import matplotlib.backends.qt_editor.formlayout as formlayout File "/home/bcl/miniconda3/envs/IntroMap/lib/python2.7/site-packages/matplotlib/backends/qt_editor/formlayout.py", line 56, in <module> from matplotlib.backends.qt_compat import QtGui, QtWidgets, QtCore File "/home/bcl/miniconda3/envs/IntroMap/lib/python2.7/site-packages/matplotlib/backends/qt_compat.py", line 137, in <module> from PyQt4 import QtCore, QtGui
ImportError: No module named PyQt4
當(dāng)然這個(gè)報(bào)錯(cuò)看起來(lái)是某個(gè)包沒(méi)裝,當(dāng)你自行搭建一個(gè)環(huán)境的時(shí)候,確實(shí)可能是你忘記裝某個(gè)模塊了,但這個(gè)conda環(huán)境是根據(jù)別的開(kāi)發(fā)者已經(jīng)寫(xiě)好測(cè)試好的.yml文件重現(xiàn)的,所以不應(yīng)該是某個(gè)模塊缺失的問(wèn)題。
上網(wǎng)搜索了一下,也有說(shuō)是因?yàn)橛脩舡h(huán)境中裝了多個(gè)版本的python,而PyQt4只是裝在了某一個(gè)python環(huán)境下,而用戶在另一個(gè)環(huán)境中調(diào)用,鑒于conda環(huán)境的獨(dú)立性,那肯定也不是這個(gè)原因。
最后解決:
修改所調(diào)用的.py腳本中的
matplotlib.use('QT4Agg')
為
matplotlib.use('QT5Agg')
問(wèn)題成功解決。
為什么?
原來(lái)是因?yàn)镻yQt這個(gè)包更新了,而在不指定版本的情況下,conda重現(xiàn)環(huán)境時(shí)會(huì)默認(rèn)下載安裝鏡像源中PyQt包的最新版本,也就是PyQt5。然而我所使用的.yml文件的開(kāi)發(fā)者在當(dāng)年開(kāi)發(fā)的時(shí)候,PyQt默認(rèn)是4版本,所以會(huì)出現(xiàn)這個(gè)錯(cuò)誤。
看中文網(wǎng)上還沒(méi)有該解決方案,所以記錄一下。
原鏈接:
Fresh matplotlib install broken: installs qt5, but matplotlib rc patched to require qt4 #1068