%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
函数返回 None
,get_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_magic
或magic
在语法上是正确的“纯”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的主要内容,如果未能解决你的问题,请参考以下文章
Jupyter中运行魔法%matplotlib inline出错ModuleNotFoundError: No module named ‘matplotlib‘