%matplotlib 行魔法导致 Python 脚本中的 SyntaxError

Posted

技术标签:

【中文标题】%matplotlib 行魔法导致 Python 脚本中的 SyntaxError【英文标题】:%matplotlib line magic causes SyntaxError in Python script 【发布时间】:2016-06-06 08:46:54 【问题描述】:

我尝试在 Spyder (Python 2.7.11) 上运行以下代码:

# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd

%matplotlib inline

import matplotlib.pyplot as plt
import matplotlib.cm as cm

import tensorflow as tf

# settings
LEARNING_RATE = 1e-4
# set to 20000 on local environment to get 0.99 accuracy
TRAINING_ITERATIONS = 2000        

DROPOUT = 0.5
BATCH_SIZE = 50

# set to 0 to train on all available data
VALIDATION_SIZE = 2000

# image number to output
IMAGE_TO_DISPLAY = 10

但是我收到了这个错误:

line 10
    %matplotlib inline
    ^
SyntaxError: invalid syntax.

如果有人给我一个解释,我很感激。

附:代码来自 Kaggle 竞赛项目:Digit Recognizer

【问题讨论】:

您是否安装了任何其他科学发行版? github.com/ContinuumIO/anaconda-issues/issues/264 我使用 Anaconda for Python 2.7.11,安装了 pandas、nump、scipy、matplotlib、scikit-learn 0.17。 .... 还有theano 0.8.0.dev0 【参考方案1】:

这不起作用有几个原因。

matplotlib 可能没有正确安装。 你试过跑步吗:

conda install matplotlib

如果这不起作用,请查看您的 %PATH% 环境变量,它是否包含您的库和 python 路径?

Similar problem on github anaconda

【讨论】:

感谢您的信息,我运行了“conda install matplotlib”并获得了一些更新。但还是一样的错误。【参考方案2】:

%matplotlib inline 中的语法 '%' 被 iPython 识别(它被设置为处理魔术方法),但 Python 本身不能识别,这会产生 SyntaxError。 Here is given one solution.

【讨论】:

我认为这是问题,直到我意识到 spyder 与 ipython 有关,然后这可能又是问题。 糟糕。令人惊讶的是,Spyder 中的 matplotlib 存在很多问题。 感谢您的回复。然而,即使我在 iPython 控制台上运行脚本,它仍然给我同样的错误。 @John,确保脚本文件名以 .ipy 结尾,如: ipython file.ipy 。如果您使用 .py 文件结尾,ipython 将其作为常规 python 脚本运行并且它不起作用。此外,对于 %matplotlib,可以使用“auto”而不是“inline”。【参考方案3】:

只有 IPython 命令行支持行魔法。它们不能简单地在脚本中使用,因为%something 不是正确的 Python 语法。

如果您想通过脚本执行此操作,您必须访问 IPython API,然后调用 run_line_magic 函数。

您必须在脚本中执行以下操作,而不是 %matplotlib inline

from IPython import get_ipython
get_ipython().run_line_magic('matplotlib', 'inline')

this answer 中描述了类似的方法,但它使用了已弃用的 magic 函数。

请注意,脚本仍然需要在 IPython 中运行。在普通 Python 下,get_ipython 函数返回 Noneget_ipython().run_line_magic 将引发 AttributeError

【讨论】:

感谢您的建议。我尝试了您的方法,又遇到了另一个错误: ImportError: No module named move (因为 iPython 正在运行代码 "from Six.moves import zip, reduce") ,我试图找出为什么会发生这种情况。 感谢您的建议,但我收到此错误AttributeError: 'NoneType' object has no attribute 'run_line_magic',您能帮忙吗?谢谢 @Always_Beginner 这听起来就像你在使用普通的 Python shell,在这种情况下 get_ipython() 返回 None。线魔法仅在 IPython 中受支持。 @kazemakase 好的,但我认为这也适用于纯 python,根据这个答案 kazemakase link 我认为它也适用于纯 python。 @Always_Beginner 在链接答案'pure python' 中指的是以% 开头的行魔法不是正确的Python 语法,但使用函数run_line_magicmagic 在语法上是正确的“纯”Python。但是,线魔术功能仅受 IPython 解释器支持,普通 Python 解释器不支持。【参考方案4】:

而不是 %matplotlib inline,它不是 python 脚本,所以我们可以这样写它会工作 从 IPython 导入 get_ipython get_ipython().run_line_magic('matplotlib', 'inline')

【讨论】:

Spyder 有一个选项。请查看Preferences > IPython console > Graphics【参考方案5】:

如果您在脚本顶部包含以下代码,matplotlib 将在 IPython 环境(如 jupyter、氢原子插件...)中内联运行,如果您启动直接通过命令行编写脚本(matplotlib 不会内联运行,图表将照常在弹出窗口中打开)。

from IPython import get_ipython
ipy = get_ipython()
if ipy is not None:
    ipy.run_line_magic('matplotlib', 'inline')

【讨论】:

好的,如果 ipy 是 None 那么这个解决方案没有任何意义。【参考方案6】:

因为仅 IPython 命令行不支持 Python cl 支持行魔法,所以使用:'exec(%matplotlib inline)' 而不是 %matplotlib inline

【讨论】:

【参考方案7】:

这是你使用 Julia 的情况:

IPython 的 %matplotlib 在 Julia 中的类似物是使用 PyPlot 包,它为 Matplotlib 提供了 Julia 接口,包括 IJulia 笔记本中的内联图。 (在 Julia 中默认已经加载了 numpy 的等价物。) 给定 PyPlot,%matplotlib inline 的类似物使用 PyPlot,因为 PyPlot 在 IJulia 中默认为内联图。

【讨论】:

以上是关于%matplotlib 行魔法导致 Python 脚本中的 SyntaxError的主要内容,如果未能解决你的问题,请参考以下文章

使用 %matplotlib inline 出错?

Jupyter中运行魔法%matplotlib inline出错ModuleNotFoundError: No module named ‘matplotlib‘

matplotlib入门

__init__.py 是 python 的后裔,但不是来自 c++;导致“导入 matplotlib”错误

python如何安装matplotlib模块

一图胜千言,200行代码图解Python Matplotlib (面向对象法)!