Mayavi 不在 Spyder 中运行:抱怨“ValueError: API 'QString' ...”

Posted

技术标签:

【中文标题】Mayavi 不在 Spyder 中运行:抱怨“ValueError: API \'QString\' ...”【英文标题】:Mayavi doesn't run from within Spyder: complains about "ValueError: API 'QString' ..."Mayavi 不在 Spyder 中运行:抱怨“ValueError: API 'QString' ...” 【发布时间】:2012-09-08 16:56:32 【问题描述】:

我无法在 Spyder IDE 中运行/使用 Mayavi 库。我已经在下面描述了这个问题。任何帮助都会非常有用。 (非常感谢您。)

重现问题的步骤:

    只需在脚本中导入 Mayavi 库(例如使用“import mayavi.mlab as mlab”)并执行该脚本就会重现此问题。 我在此处包含一个测试代码(请注意,此代码是来自 Mayavi 网站的示例代码)以重现该问题:

代码

from numpy import sin, cos, mgrid
import mayavi.mlab as mmlab

def f(x,y):
  return sin(x + y) + sin(2*x - y) + cos(3*x + 4*y)
        
x,y = mgrid[-7.:7.05:0.01, -5.:5.05:0.05]
z = f(x,y)
s = mmlab.contour_surf(x,y,z)
mmlab.show()

预期输出和错误:

预期输出:带有图形的 Mayavi 图形窗口。 我看到的是:控制台窗口中出现以下值错误(我包括完整的消息序列以便明确):

-------------- 错误信息的开始 -------------- ----

Traceback (most recent call last):
  File "C:\PROGRAMSANDEXPERIMENTS\PYTHON\MayaviScripts\Learning\testMayavi.py", line 2, in <module>
    import mayavi.mlab as mmlab
  File "C:\Python27\lib\site-packages\mayavi\mlab.py", line 27, in <module>
    from mayavi.tools.camera import view, roll, yaw, pitch, move
  File "C:\Python27\lib\site-packages\mayavi\tools\camera.py", line 25, in <module>
    from engine_manager import get_engine
  File "C:\Python27\lib\site-packages\mayavi\tools\engine_manager.py", line 12, in <module>
    from mayavi.preferences.api import preference_manager
  File "C:\Python27\lib\site-packages\mayavi\preferences\api.py", line 4, in <module>
    from preference_manager import preference_manager
  File "C:\Python27\lib\site-packages\mayavi\preferences\preference_manager.py", line 29, in <module>
    from traitsui.api import View, Group, Item
  File "C:\Python27\lib\site-packages\traitsui\api.py", line 35, in <module>
    from .editors.api import (ArrayEditor, BooleanEditor, ButtonEditor,
  File "C:\Python27\lib\site-packages\traitsui\editors\__init__.py", line 22, in <module>
    from .api import (toolkit, ArrayEditor, BooleanEditor, ButtonEditor,
  File "C:\Python27\lib\site-packages\traitsui\editors\api.py", line 10, in <module>
    from .code_editor import CodeEditor
  File "C:\Python27\lib\site-packages\traitsui\editors\code_editor.py", line 36, in <module>
    class ToolkitEditorFactory ( EditorFactory ):
  File "C:\Python27\lib\site-packages\traitsui\editors\code_editor.py", line 48, in ToolkitEditorFactory
    mark_color = Color( 0xECE9D8 )
  File "C:\Python27\lib\site-packages\traits\traits.py", line 487, in __call__
    return self.maker_function( *args, **metadata )
  File "C:\Python27\lib\site-packages\traits\traits.py", line 1183, in Color
    return ColorTrait( *args, **metadata )
  File "C:\Python27\lib\site-packages\traitsui\toolkit_traits.py", line 7, in ColorTrait
    return toolkit().color_trait( *args, **traits )
  File "C:\Python27\lib\site-packages\traitsui\toolkit.py", line 109, in toolkit
    _toolkit = _import_toolkit(ETSConfig.toolkit)
  File "C:\Python27\lib\site-packages\traitsui\toolkit.py", line 51, in _import_toolkit
    return __import__( name, globals=globals(), level=1 ).toolkit
  File "C:\Python27\lib\site-packages\traitsui\qt4\__init__.py", line 18, in <module>
    import pyface.qt
  File "C:\Python27\lib\site-packages\pyface\qt\__init__.py", line 35, in <module>
    prepare_pyqt4()
  File "C:\Python27\lib\site-packages\pyface\qt\__init__.py", line 17, in prepare_pyqt4
    sip.setapi('QString', 2)
  ValueError: API 'QString' has already been set to version 1

---------------- 错误信息结束 ------------ --------

我的环境如下:

至少在以下两种环境中观察到此问题:

环境1:

描述:Spyder 和所有其他组件是使用 Pythonxy 发行版 (Py(x,y)-2.7.2.3.exe) 在 Windows 7 32 位机器上安装的。 蜘蛛版本:2.1.9 Python 版本:2.7.2(32 位) Qt 版本:4.7.4,Windows 上的 PyQt4 (API v1) 4.8.6 Mayavi 版本:4.1.0

环境 2:

描述:在运行 64 位 Windows 7 的单独机器上,我安装了 64 位版本的 Enthought EPD 发行版。所以它运行的是 2.7.3 (x64) 版本的 Python 发行版。由于 EPD 包不包含 Spyder,所以我在安装 PyQt GPLv4.9.4 后手动安装了 Spyder。 蜘蛛版本:2.1.11 Python 版本:2.7.3(64 位) Qt 版本:4.8.2,Windows 上的 PyQt4 (API v2) 4.9.4 Mayavi 版本:4.2.0

其他信息:

我确信代码没问题,因为脚本在“外部”spyder 环境执行时会产生预期的输出。例如,使用 IPython shell。

谢谢。

【问题讨论】:

那个代码确实没问题。如果尝试使用sip.setapi PyQt 导入后设置PyQt api,则会发生此错误。 Mayavi 正在尝试设置它,但显然 Spyder 已经为 shell 导入/使用了 PyQt。这看起来像是 Spyder 方面的错误。 【参考方案1】:

感谢 Avaris 的回复。

我现在有一个解决方案(我不确定它是否是“修复”)。我在Tools-&gt;Preferences-&gt;Console-&gt;External Modules-&gt;Enthought Tool Suite-&gt;ETS_TOOLKIT中修改了以下设置:从Qt4更改为wx。 更改此设置后,我可以直接在 Spyder 中使用 Mayavi 库和 Mayavi 绘图执行代码。

【讨论】:

【参考方案2】:

对于linux用户,可以参考this issues中imranal的回答。

只需将export ETS_TOOLKIT=qt4 添加到~/.bashrc 的新行即可。 不要忘记source ~/.bashrc 文件!

【讨论】:

OP 明确提到目标系统为 Windows。 @SergeyA 对不起,但我自己是 Linux 用户,遇到了完全相同的问题。在我用谷歌搜索之后,我在 SO 上发现了这个问题。由于 python 是跨平台的,我肯定会有其他一些 linux 用户在这里。而且我认为他们有权知道如何进行调试。我只是帮个忙。【参考方案3】:

根据this 和this 可以通过激活Preferences &gt; Console &gt; External Modules 中的Ignore API change errors (sip.setapi) 复选框来修复错误。

我已经测试过它确实适用于 Spyder 2.1.11。

【讨论】:

以上是关于Mayavi 不在 Spyder 中运行:抱怨“ValueError: API 'QString' ...”的主要内容,如果未能解决你的问题,请参考以下文章

Frozenset 不在 Spyder 变量资源管理器中显示其内容

Spyder 无法从 anaconda 打开

使用带有 mayavi 导入的 pyinstaller 创建独立的 exe

科学计算三维可视化---Mayavi入门(Mayavi管线)

是否可以在 tkinter 中嵌入 mayavi 图?

在 spyder 4 中恢复已删除的文件