6

这是通过 Eclipse 线程对这个交互式 matplolib的跟进,大约有 2 年的历史,我想知道在此期间是否有任何进展。

我在 Eclipse PyDev 的控制台窗口中运行 IPython 控制台,但是我无法使用 matplotlib 获得与在 Eclipse PyDev外部的(Windows)命令提示符下运行 IPython 相同的交互式绘图功能。以下是两者的比较:

A) 在 Eclipse PyDev 之外的 shell 中运行 IPython

  1. 使用“ipython --pylab”在 Windows 命令提示符下运行 IPython
  2. 在 IPython 控制台中输入“plot([1,2,3])”。这将打开一个图形绘图窗口,并且 IPython 控制台已准备好执行进一步的命令(无需关闭图形绘图窗口)。
  3. 例如,我可以输入“xlabel('years')”,这将更新我的图形绘图窗口。

B) 在 Eclipse PyDev 中的交互式控制台中运行 IPython 在 Eclipse PyDev 中的 IPython 交互式控制台中输入以下内容:

  1. “从 pylab 导入 *”
  2. "plot([1,2,3])" --> 图形绘图窗口不显示。
  3. 我必须输入“show()”才能打开图形绘图窗口。但现在的问题是,只要我保持图形绘图窗口打开,IPython 控制台就不会接受任何新命令。
  4. 所以我关闭图形绘图窗口,输入“xlabel('years')”,然后再次输入“show()”。这将重新打开以“年”作为我的轴标签的图形绘图窗口,但绘图本身是空的,不再显示 [1,2,3] 数据。

有了这种行为,A) 显然优于 B),但我想继续在 Eclipse PyDev 中工作,因为我喜欢总是在我的屏幕上显示变量列表(不必像运行 IPython 表单时那样运行命令来显示所有变量一个 Windows 外壳)。正如另一个线程中所建议的那样,使用 Wicked Shell 不起作用(IPython 在 Wicked Shell 中无法正常工作)。

如何在 Eclipse PyDev 中配置 IPython,使其显示与在 Windows 命令提示符下运行它相同的交互行为?

4

4 回答 4

9

您可以通过在 PyDev Preference 中为交互式控制台选择 GUI 来解决此问题。

Eclipse -> 窗口 -> 首选项 -> Pydev -> 交互式控制台 -> 启用 GUI 事件循环集成。

就我而言,我选择了 PyQt (qt/qt4)

于 2014-05-13T14:32:00.400 回答
4

为可能不完整的答案道歉,但希望我能够阐明这个问题。

我相信 OP 描述的是正常行为。事实上,从命令行 ipython 开始,导入 pylab 并发出 plot 命令会产生所描述的阻塞行为,因此这与 pydev 或 eclipse 无关。事实是 matplotlib 中的 show 在交互模式下是阻塞的;当您在以“ipython --pylab”开始的 ipython 会话中使用 matplotlib 时,您正在利用 ipython 开发人员围绕 matplotlib 为您所做的一些“黑客”,允许同时具有交互模式和非阻塞调用。但是,导入 pylab 并不足以应用这些“hacks”。PyDev 似乎不允许解释器调用的标志,所以不能直接调用“ipython --pylab”。

幸运的是,ipython 有一个特殊的命令“pylab”,即使解释器没有以 pylab 标志启动,它也会应用 hack 并导入 pylab。因此,您可以尝试在控制台中输入“pylab”(实际上,您甚至可以自定义您的 pydev 控制台,使其自动完成),您应该会得到所需的行为。但是,我必须报告说,虽然从命令行启动的 ipython 会话对我来说效果很好,但是当我尝试从 Eclipse 内部执行相同操作时出现问题。该命令没有阻止,我得到了 python 图标,但 matplotlib 窗口没有出现。作为记录,我在运行 Snow Leopard 的 Mac 上。我无法判断在 Windows 中是否也会发生同样的问题,OP 似乎正在使用。

于 2013-01-25T22:04:04.223 回答
0

只需使用%matplotlib魔法命令来激活交互式绘图(正是您所描述的)。

pylab命令导入numpy.*pylab.*,严重污染您的全局命名空间。

于 2014-02-16T22:10:16.913 回答
0

我通过在另一个线程中执行绘图功能在 Eclipse PyDev 中实现了类似的行为:

import threading
from pylab import *
import matplotlib.animation as animation
import time

x = array(range(0,1000))/100
y = sin(x)

def updateData(self):
    ax.set_data(x,y)

def MyThread():
    global ax
    fig, axarr = subplots(1)
    ax, = axarr.plot(x,y)
    simulation = animation.FuncAnimation(fig, updateData)
    show()


t = threading.Thread(target=MyThread)
t.start()

# console stay active, user can interactively control figure
time.sleep(1)
y = sin(2*x)
time.sleep(2)
ax.get_axes().grid()
ax.get_axes().set_xlabel("time")

使用工具链 Eclipse 4.3、PyDev 2.7.1、Python 3.2、IPython 0.13 测试

于 2013-03-29T12:55:43.153 回答