Search code examples
python-2.7sublimetext2spydermayavi

On windows: Python editor cannot import mlab from mayavi, command prompt can


I'm new to Python, but I'm having some trouble using the mayavi package on Windows. I have installed Python(x,y) and I'm using the Sublime Text 2 and Spyder editor. So far I have found that running this code from the mayavi website:

from numpy import pi, sin, cos, mgrid
dphi, dtheta = pi/250.0, pi/250.0
[phi,theta] = mgrid[0:pi+dphi*1.5:dphi,0:2*pi+dtheta*1.5:dtheta]
m0 = 4; m1 = 3; m2 = 2; m3 = 3; m4 = 6; m5 = 2; m6 = 6; m7 = 4;
r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7
x = r*sin(phi)*cos(theta)
y = r*cos(phi)
z = r*sin(phi)*sin(theta)
# View it.
from mayavi import mlab
s = mlab.mesh(x, y, z)
mlab.show()

Results in the following error:

Traceback (most recent call last):
  File "C:\Dropbox\...\test.py", line 23, in <module>
    from mayavi import mlab
  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 36, in <module>
    from .editors.api import ArrayEditor
  File "C:\Python27\lib\site-packages\traitsui\editors\__init__.py", line 23, in <module>
    from .api import ArrayEditor
  File "C:\Python27\lib\site-packages\traitsui\editors\api.py", line 24, 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 489, in __call__
    return self.maker_function( *args, **metadata )
  File "C:\Python27\lib\site-packages\traits\traits.py", line 1203, 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 122, in toolkit
    _toolkit = _import_toolkit( toolkit_name )
  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\wx\__init__.py", line 26, in <module>
    import toolkit
  File "C:\Python27\lib\site-packages\traitsui\wx\toolkit.py", line 61, in <module>
    from helper \
  File "C:\Python27\lib\site-packages\traitsui\wx\helper.py", line 43, in <module>
    from pyface.timer.api \
  File "C:\Python27\lib\site-packages\pyface\timer\api.py", line 17, in <module>
    from .timer import Timer
  File "C:\Python27\lib\site-packages\pyface\timer\timer.py", line 8, in <module>
    from pyface.toolkit import toolkit_object
  File "C:\Python27\lib\site-packages\pyface\toolkit.py", line 73, in <module>
    _init_toolkit()
  File "C:\Python27\lib\site-packages\pyface\toolkit.py", line 45, in _init_toolkit
    be = import_toolkit(tk)
  File "C:\Python27\lib\site-packages\pyface\toolkit.py", line 31, in import_toolkit
    __import__(be + 'init')
  File "C:\Python27\lib\site-packages\pyface\ui\qt4\init.py", line 18, in <module>
    from pyface.qt import QtCore, QtGui, qt_api
  File "C:\Python27\lib\site-packages\pyface\qt\__init__.py", line 33, in <module>
    prepare_pyqt4()
  File "C:\Python27\lib\site-packages\pyface\qt\__init__.py", line 17, in prepare_pyqt4
    sip.setapi('QDate', 2)
ValueError: API 'QDate' has already been set to version 1
[Finished in 1.5s with exit code 1]

The weird thing is, when running the mayavi code directly in command prompt, it does work! So why do I get the error in both Sublime Text 2 and in Spyder?

Thank you for taking the time to look at my question

Edit: when importing numpy completely instead of the pi, sin, cos, and mgrid commands only: the error changes to:

Traceback (most recent call last):
  File "C:\Dropbox\Mijn documenten\CiTG\CIE5 - MSc Thesis\Python_TopOpPy_Christopher\testy.py", line 24, in <module>
    from mayavi import mlab
  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 36, in <module>
    from .editors.api import ArrayEditor
  File "C:\Python27\lib\site-packages\traitsui\editors\__init__.py", line 23, in <module>
    from .api import ArrayEditor
  File "C:\Python27\lib\site-packages\traitsui\editors\api.py", line 24, 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 489, in __call__
    return self.maker_function( *args, **metadata )
  File "C:\Python27\lib\site-packages\traits\traits.py", line 1203, 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 125, in toolkit
    ETSConfig.toolkit = toolkit_name
  File "C:\Python27\lib\site-packages\traits\etsconfig\etsconfig.py", line 213, in _set_toolkit
    "already been set to %s" % (toolkit, self._toolkit)
ValueError: cannot set toolkit to wx because it has already been set to qt4

This makes the problem seem very similar to the one in this question. The solution there does not seem feasible for Sublime Text 2, however. And the Spyder solution does not work for me because the 'Enthought Tool Suite' option is greyed out. Any help is still appreciated!


Solution

  • For other running into the same problem, I have found the solution. What worked for me is including the following code:

    from traits.etsconfig.api import ETSConfig
    ETSConfig.toolkit = 'qt4'
    

    For example:

    from traits.etsconfig.api import ETSConfig
    ETSConfig.toolkit = 'qt4' # Force PyQt4 utilization
    
    import numpy
    
    dphi, dtheta = numpy.pi/250.0, numpy.pi/250.0
    [phi,theta] = numpy.mgrid[0:numpy.pi+dphi*1.5:dphi,0:2*numpy.pi+dtheta*1.5:dtheta]
    m0 = 4; m1 = 3; m2 = 2; m3 = 3; m4 = 6; m5 = 2; m6 = 6; m7 = 4;
    r = numpy.sin(m0*phi)**m1 + numpy.cos(m2*phi)**m3 + numpy.sin(m4*theta)**m5 + numpy.cos(m6*theta)**m7
    x = r*numpy.sin(phi)*numpy.cos(theta)
    y = r*numpy.cos(phi)
    z = r*numpy.sin(phi)*numpy.sin(theta)
    
    # View it.
    from mayavi import mlab
    s = mlab.mesh(x, y, z)
    mlab.show()
    

    gives the correct result.