如果在导入pyplot之前导入pandas,会出现ModuleNotFoundError错误。

11

今天早上我遇到了一个奇怪的错误,希望能获得一些背景信息。我已经找到了一个解决方法,但我想知道是否存在更深层次的问题。我在SE或其他在线资源中找不到任何相关信息。

错误内容: 如果我在导入matplotlib.pyplot之前导入pandas,则会收到以下错误消息:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    import matplotlib.pyplot as plt
  File "/usr/lib64/python3.6/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/usr/lib64/python3.6/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
ModuleNotFoundError: No module named 'matplotlib.backends.backend_qt4agg'

代码示例:

import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas

plt.plot([1,2,3],[3,2,1])
plt.show()

不能正常工作的代码:

import pandas
import matplotlib as mpl
import matplotlib.pyplot as plt

plt.plot([1,2,3],[3,2,1])
plt.show()
注意:从文件中运行代码失败(python3 test.py),但从命令行解释器中运行代码可以正常工作。
我今天早上尝试更新我的Python包,虽然我认为它没有做任何事情。我想获取Pandas 23以使用我在其文档中看到的函数。我更新了pip3('pip install --user pip'),认为它会有最新版本。我遇到了一些问题与pip 10.0.1 (请参见https://github.com/pypa/pip/issues/5221),但这似乎已经被神奇地解决了,尽管我实际上没有执行该线程上的任何建议解决方案。无论如何,结果是我正在使用pip可用的最新版本的Pandas(0.20.1),所以我保留了它。我今天早上还进行了'dnf update',也尝试解决pip问题。
我正在使用Python 3.6.5、Pandas 0.20.1和Matplotlib 2.0.0。运行Fedora 26。我的代码之前运行良好(Pandas在导入pyplot之前),直到我尝试更新之后。
关键是,我做了几件可能会破坏它的事情,我想找出原因。似乎导入顺序应该无关紧要。对于导致这种情况的原因有什么想法吗?如果它实际上是一个错误(而不仅仅是pebkac问题),我应该向哪里报告呢?
干杯

尝试使用 mpl.get_backend() 查找是否在两种情况下都使用相同的后端? - sathyz
在失败的示例中,如果你在 import pandas之后立即执行 import sys; print(sys.modules['matplotlib'].__version__)会发生什么? - Mad Physicist
sathyz: get_backend()对于这两个示例都返回TkAgg。 - sluginthemud
疯狂物理学家:打印出版本2.0.0(对于通过的代码也打印相同的内容)。 - sluginthemud
Shiva:1)我不知道那是它的名称。2)我没有意识到它很重要,所以我没有在测试文件中包含它。3)不幸的是,当我把它加回去时(#!/usr/bin/env python3),代码仍然失败了。 - sluginthemud
显示剩余3条评论
1个回答

1

~/.matplotlib/matplotlibrc文件中可以修改后端设置。如果你已经安装,将其从TkAgg更改为Agg或其他后端。

或者你可以尝试这个方法:

import matplotlib
matplotlib.use('Agg')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接