【问题标题】:Unable to "import matplotlib.pyplot as plt" in virtualenv无法在 virtualenv 中“将 matplotlib.pyplot 作为 plt 导入”
【发布时间】:2015-06-08 15:21:50
【问题描述】:

我正在虚拟环境中使用烧瓶。我能够使用 pip 安装 matplotlib,并且可以在 Python 会话中 import matplotlib。但是,当我将其导入为

matplotlib.pyplot as plt

我收到以下错误:

>>> import matplotlib.pyplot as plt

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "//anaconda/envs/myenv/lib/python2.7/site-packages/matplotlib/pyplot.py", line 109, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "//anaconda/envs/myenv/lib/python2.7/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "//anaconda/envs/myenv/lib/python2.7/site-packages/matplotlib/backends/backend_macosx.py", line 24, in <module>
    from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends.

我很困惑为什么它要求我安装 Python 作为框架。不是已经存在了吗? “将 Python 安装为框架”是什么意思,如何安装?

【问题讨论】:

  • 你在什么操作系统上做这个?
  • 这是 MacOS。我相信是 10.6。

标签: python macos matplotlib flask virtualenv


【解决方案1】:

一个干净简单的解决方案是创建一个内核,将PYTHONHOME 设置为VIRTUAL_ENV,然后使用系统 Python 可执行文件(而不是 virtualenv 中的那个)。

如果您想自动创建这样的内核,可以使用jupyter-virtualenv-osx 脚本。

【讨论】:

    【解决方案2】:

    如果您不想设置.matplotib/matplotlibrc 配置文件,可以通过在运行时在导入matplotlib 和导入matplotlib.pyplot 之前设置'Agg' 后端来规避此问题:

    In [1]: import matplotlib
    
    In [2]: matplotlib.use('Agg')
    
    In [3]: import matplotlib.pyplot as plt
    
    In [4]: fig, ax = plt.subplots(1, 1)
    
    In [5]: import numpy as np
    
    In [6]: x = np.linspace(-1., 1.)
    
    In [7]: y = np.sin(x)
    
    In [8]: ax.plot(x, y)
    Out[8]: [<matplotlib.lines.Line2D at 0x1057ecf10>]
    
    In [9=]: fig.savefig('myplot.png')
    

    【讨论】:

      【解决方案3】:

      这个solution 为我工作。如果您已经在虚拟环境中使用 pip 安装了 matplotlib,则只需键入以下内容:

      $ cd ~/.matplotlib
      $ nano matplotlibrc
      

      然后,在里面写上backend: TkAgg。 如果您需要更多信息,请转到解决方案链接。

      【讨论】:

      • 又好又简单。非常感谢!
      • 单行:echo "backend : TkAgg" &gt; ~/.matplotlib/matplotlibrc 或 echo "backend : Agg" &gt; ~/.matplotlib/matplotlibrc
      • 当我以 root 身份尝试此操作时,我得到一个“没有这样的文件或目录错误”。这个文件应该有某种扩展名吗? (在 mac 10.12.3 上)
      • matplotlibrc 最初是缺失的。如果没有找到就创建它
      • 文件名应该是什么?
      【解决方案4】:

      我遇到了同样的错误,并尝试了Jonathan的回答:

      您可以使用后端 Agg 解决此问题

      转到User/yourname/.matplotlib 并打开/创建matplotlibrc 并添加以下行backend : Agg,它应该适合你。

      我运行程序,没有报错,也没有出图,我试了backend: Qt4Agg, 它打印出我没有安装 PyQt4。

      然后我尝试了另一个后端:backend: TkAgg,它可以工作!

      所以也许我们可以尝试不同的后端,有些可能会工作或安装所需的包,如 PyQt4。

      这是一个示例 python sn-p,您可以尝试测试 matplotlib。

      import matplotlib
      
      matplotlib.use('TkAgg')
      import matplotlib.pyplot as plt
      
      plt.plot([1, 2, 3], [0, 3, 7])
      plt.show()
      

      【讨论】:

      • 我正在使用 macOS high sierra,当我使用 TkAgg 时,它显示我没有安装 tkinter 包。当我使用 Qt4Agg 或 Qt5Agg 时,它显示我没有安装 PyQt。如果我使用brew install pyqt 安装 PyQt 也无济于事。最后,我必须将它安装在 virtualenv 中,“激活 virtualenv,然后pip install PyQt5”。这行得通。
      【解决方案5】:

      您可以通过使用后端Agg来解决此问题

      转到User/yourname/.matplotlib 并打开/创建matplotlibrc 并添加以下行backend : Agg,它应该适合你。

      【讨论】:

        【解决方案6】:

        虽然大多数答案似乎都指向修补 activate 脚本以使用系统 python,但我无法让它工作,对我来说一个简单的解决方案 - 虽然有点畏缩 - 是将 matplotlib 安装到全局环境并使用它而不是 virtualenv 实例。您可以通过使用 --system-site-packages 标志(如 virtualenv --system-site-packages foo)创建您的 virtualenv 来做到这一点,或者在 pip 安装时使用通用标志(如 pip install -U matplotlib)。

        【讨论】:

          【解决方案7】:

          当我使用 pip 安装 matplotlib 时,我遇到了类似的问题。默认情况下,它安装了最新版本,即 1.5.0。但是,我有另一个使用 Python 3.4 和 matplotlib 1.4.3 的虚拟环境,当我导入 matplotlib.pyplot 时,这个环境运行良好。因此,我使用以下命令安装了早期版本的 matplotlib:

          cd path_to_virtual_environment    # assume directory is called env3
          env3/bin/pip install matplotlib==1.4.3
          

          我知道这只是一种变通方法,但它对我来说是一种短期解决方法。

          【讨论】:

          • 谢谢!我喜欢这个答案!
          • 对我来说,我有一个带有 matplotlib==2.1.0 的 python 2.7 pyenv 环境和带有 matplotlib==2.1.1 的 python 3.6。我将 2.7 的 matplotlib 升级到 2.1.1,问题得到解决。
          • 也为我工作。拯救了我的一天 :-) 非常感谢!
          猜你喜欢
          • 2017-11-05
          • 1970-01-01
          • 2014-08-09
          • 2019-02-26
          • 1970-01-01
          • 2015-04-23
          • 2013-12-27
          • 1970-01-01
          • 2014-12-05
          相关资源
          最近更新 更多