Skip to content

Possible bug in Widget in Napari plugin #270

Description

@saramcardle

Sorry to be this person. I also tried using the Napari plugin. I installed it via the plugin manager. That seems to have worked and the menu item appears. But, when I try to open it, I get these errors:

INFO ultrack.utils.cuda [2026-04-20 14:09:26,462] (MainThread): cupy not found.

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\npe2\_command_registry.py:33, in CommandHandler.resolve(self=CommandHandler(id='ultrack.main_widget', function=None, python_name='ultrack.widgets:UltrackWidget'))
     32 try:
---> 33     self.function = utils.import_python_name(self.python_name)
        self.function = None
        self.python_name = 'ultrack.widgets:UltrackWidget'
        self = CommandHandler(id='ultrack.main_widget', function=None, python_name='ultrack.widgets:UltrackWidget')
        utils = <module 'npe2.manifest.utils' from 'C:\\Users\\smcardle\\AppData\\Local\\napari-0.7.0\\envs\\napari-0.7.0\\Lib\\site-packages\\npe2\\manifest\\utils.py'>     34 except Exception as e:

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\npe2\manifest\utils.py:256, in import_python_name(python_name='ultrack.widgets:UltrackWidget')
    254 module_name, funcname = match.groups()  # type: ignore [union-attr]
--> 256 mod = import_module(module_name)
        module_name = 'ultrack.widgets'    257 return getattr(mod, funcname)

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\importlib\__init__.py:126, in import_module(name='ultrack.widgets', package=None)
    125         level += 1
--> 126 return _bootstrap._gcd_import(name[level:], package, level)
        level = 0
        name = 'ultrack.widgets'
        name[level:] = 'ultrack.widgets'
        package = None
        _bootstrap = <module '_frozen_importlib' (frozen)>
File <frozen importlib._bootstrap>:1204, in _gcd_import(name='ultrack.widgets', package=None, level=0)

File <frozen importlib._bootstrap>:1176, in _find_and_load(name='ultrack.widgets', import_=<function _gcd_import>)

File <frozen importlib._bootstrap>:1126, in _find_and_load_unlocked(name='ultrack.widgets', import_=<function _gcd_import>)

File <frozen importlib._bootstrap>:241, in _call_with_frames_removed(f=<function _gcd_import>, *args=('ultrack',), **kwds={})

File <frozen importlib._bootstrap>:1204, in _gcd_import(name='ultrack', package=None, level=0)

File <frozen importlib._bootstrap>:1176, in _find_and_load(name='ultrack', import_=<function _gcd_import>)

File <frozen importlib._bootstrap>:1147, in _find_and_load_unlocked(name='ultrack', import_=<function _gcd_import>)

File <frozen importlib._bootstrap>:690, in _load_unlocked(spec=ModuleSpec(name='ultrack', loader=<_frozen_impor...nvs\\napari-0.7.0\\Lib\\site-packages\\ultrack']))

File <frozen importlib._bootstrap_external>:940, in exec_module(self=<_frozen_importlib_external.SourceFileLoader object>, module=<module 'ultrack' from 'C:\\Users\\smcardle\\App...0.7.0\\Lib\\site-packages\\ultrack\\__init__.py'>)

File <frozen importlib._bootstrap>:241, in _call_with_frames_removed(f=<built-in function exec>, *args=(<code object <module> at 0x000001E818B9EBE0, fil...0\Lib\site-packages\ultrack\__init__.py", line 1>, {'MainConfig': <class 'ultrack.config.config.MainConfig'>, '__builtins__': {'ArithmeticError': <class 'ArithmeticError'>, 'AssertionError': <class 'AssertionError'>, 'AttributeError': <class 'AttributeError'>, 'BaseException': <class 'BaseException'>, 'BaseExceptionGroup': <class 'BaseExceptionGroup'>, 'BlockingIOError': <class 'BlockingIOError'>, 'BrokenPipeError': <class 'BrokenPipeError'>, 'BufferError': <class 'BufferError'>, 'BytesWarning': <class 'BytesWarning'>, 'ChildProcessError': <class 'ChildProcessError'>, ...}, '__cached__': r'C:\Users\smcardle\AppData\Local\napari-0.7.0\env...ages\ultrack\__pycache__\__init__.cpython-311.pyc', '__doc__': None, '__file__': r'C:\Users\smcardle\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack\__init__.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object>, '__name__': 'ultrack', '__package__': 'ultrack', '__path__': [r'C:\Users\smcardle\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack'], '__spec__': ModuleSpec(name='ultrack', loader=<_frozen_impor...nvs\\napari-0.7.0\\Lib\\site-packages\\ultrack']), ...}), **kwds={})

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack\__init__.py:16
     15 from ultrack.config.config import MainConfig, load_config
---> 16 from ultrack.core.export.ctc import to_ctc
     17 from ultrack.core.export.exporter import export_tracks_by_extension

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack\core\export\__init__.py:1
----> 1 from ultrack.core.export.ctc import to_ctc
      2 from ultrack.core.export.exporter import export_tracks_by_extension

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack\core\export\ctc.py:22
     21 from ultrack.config.dataconfig import DataConfig
---> 22 from ultrack.core.database import NodeDB
     23 from ultrack.core.export.utils import (
     24     export_segmentation_generic,
     25     filter_nodes_generic,
     26     solution_dataframe_from_sql,
     27 )

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack\core\database.py:27
     26 from ultrack.utils.array import assert_same_length
---> 27 from ultrack.utils.constants import NO_PARENT
     29 Base = declarative_base()

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack\utils\__init__.py:1
----> 1 from ultrack.utils.edge import labels_to_contours, labels_to_edges
      2 from ultrack.utils.estimation import estimate_parameters_from_labels

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack\utils\edge.py:10
      9 from ultrack.utils.array import create_zarr
---> 10 from ultrack.utils.cuda import import_module, to_cpu, xp
     11 from ultrack.utils.deprecation import rename_argument

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\ultrack\utils\cuda.py:35
     34 try:
---> 35     import torch as th
     37     LOG.info("torch found.")

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\torch\__init__.py:285
    283     kernel32.SetErrorMode(prev_error_mode)
--> 285 _load_dll_libraries()
    286 del _load_dll_libraries

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\torch\__init__.py:268, in _load_dll_libraries()
    265     err.strerror += (
    266         f' Error loading "{dll}" or one of its dependencies.'
    267     )
--> 268     raise err
        err = OSError(22, 'The specified procedure could not be found.', None, 127)    269 elif res is not None:

OSError: [WinError 127] The specified procedure could not be found. Error loading "C:\Users\smcardle\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\torch\lib\shm.dll" or one of its dependencies.

The above exception was the direct cause of the following exception:

RuntimeError                              Traceback (most recent call last)
File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\app_model\backends\qt\_qaction.py:70, in QCommandAction._on_triggered(self=QMenuItemAction(MenuItem(when=None, group='3_plu...='Ultrack (ultrack)'))), alt=None), app='napari'), checked=True)
     66 def _on_triggered(self, checked: bool) -> None:
     67     # execute_command returns a Future, for the sake of eventually being
     68     # asynchronous without breaking the API.  For now, we call result()
     69     # to raise any exceptions.
---> 70     self._app.commands.execute_command(self._command_id).result()
        self._command_id = 'ultrack:Ultrack'
        self = QMenuItemAction(MenuItem(when=None, group='3_plugin_contributions', order=None, command=CommandRule(id='ultrack:Ultrack', title='Ultrack', category=None, tooltip=None, status_tip=None, icon=None, icon_visible_in_menu=True, enablement=None, short_title=None, toggled=ToggleRule(condition=None, get_current=functools.partial(<function _get_current_dock_status at 0x000001E78E856DE0>, full_name='Ultrack (ultrack)'))), alt=None), app='napari')
        self._app = Application('napari')
File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\app_model\registries\_commands_reg.py:247, in CommandsRegistry.execute_command(self=<CommandsRegistry at 0x1e78e727c90 (177 commands)>, id='ultrack:Ultrack', execute_asynchronously=False, *args=(), **kwargs={})
    243 except Exception as e:
    244     if self._raise_synchronous_exceptions:
    245         # note, the caller of this function can also achieve this by
    246         # calling `future.result()` on the returned future object.
--> 247         raise e
    248     future.set_exception(e)
    250 return future

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\app_model\registries\_commands_reg.py:242, in CommandsRegistry.execute_command(self=<CommandsRegistry at 0x1e78e727c90 (177 commands)>, id='ultrack:Ultrack', execute_asynchronously=False, *args=(), **kwargs={})
    240 future: Future = Future()
    241 try:
--> 242     future.set_result(cmd(*args, **kwargs))
        future = <Future at 0x1e79dc56390 state=pending>
        cmd = <function Store.inject.<locals>._inner.<locals>._exec at 0x000001E79A8E36A0>
        args = ()
        kwargs = {}    243 except Exception as e:
    244     if self._raise_synchronous_exceptions:
    245         # note, the caller of this function can also achieve this by
    246         # calling `future.result()` on the returned future object.

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\in_n_out\_store.py:934, in Store.inject_processors.<locals>._deco.<locals>._exec(*args=(), **kwargs={})
    932 @wraps(func)
    933 def _exec(*args: P.args, **kwargs: P.kwargs) -> R:
--> 934     result = func(*args, **kwargs)
        func = <function Store.inject.<locals>._inner.<locals>._exec at 0x000001E79A8E3740>
        args = ()
        kwargs = {}    935     if result is not None:
    936         self.process(
    937             result,
    938             type_hint=type_hint,
   (...)    941             _funcname=getattr(func, "__qualname__", str(func)),
    942         )

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\in_n_out\_store.py:804, in Store.inject.<locals>._inner.<locals>._exec(*args=(), **kwargs={})
    797 logger.debug(
    798     "  Calling %s with %r (injected %r)",
    799     _fname,
    800     bound.arguments,
    801     _injected_names,
    802 )
    803 try:
--> 804     result = func(**bound.arguments)
        bound = <BoundArguments (plugin='ultrack', widget_name='Ultrack', full_name='Ultrack (ultrack)')>
        func = functools.partial(<function _toggle_or_get_widget at 0x000001E78E856D40>, plugin='ultrack', widget_name='Ultrack', full_name='Ultrack (ultrack)')
        bound.arguments = {'plugin': 'ultrack', 'widget_name': 'Ultrack', 'full_name': 'Ultrack (ultrack)'}    805 except TypeError as e:
    806     if "missing" not in e.args[0]:

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\napari\_qt\_qplugins\_qnpe2.py:199, in _toggle_or_get_widget(plugin='ultrack', widget_name='Ultrack', full_name='Ultrack (ultrack)')
    196     return None
    198 # Get widget param name (if any) and check type
--> 199 widget_callable, _ = get_widget_contribution(plugin, widget_name)  # type: ignore [misc]
        plugin = 'ultrack'
        widget_name = 'Ultrack'    200 widget_param = _get_widget_viewer_param(widget_callable, widget_name)
    202 kwargs = {}

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\napari\plugins\_npe2.py:109, in get_widget_contribution(plugin_name='ultrack', widget_name='Ultrack')
    107     if contrib.plugin_name == plugin_name:
    108         if not widget_name or contrib.display_name == widget_name:
--> 109             return contrib.get_callable(), contrib.display_name
        contrib = WidgetContribution(command='ultrack.main_widget', display_name='Ultrack', autogenerate=False)
        contrib.display_name = 'Ultrack'    110         widgets_seen.add(contrib.display_name)
    111 if widget_name and widgets_seen:

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\npe2\manifest\contributions\_widgets.py:50, in WidgetContribution.get_callable(self=WidgetContribution(command='ultrack.main_widget', display_name='Ultrack', autogenerate=False), _registry=None)
     47 def get_callable(
     48     self, _registry: CommandRegistry | None = None
     49 ) -> Callable[..., Widget]:
---> 50     func = super().get_callable()
     51     if self.autogenerate:
     52         try:

File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\npe2\manifest\utils.py:67, in Executable.get_callable(self=WidgetContribution(command='ultrack.main_widget', display_name='Ultrack', autogenerate=False), _registry=<npe2._command_registry.CommandRegistry object>)
     64     from npe2._plugin_manager import PluginManager
     66     _registry = PluginManager.instance().commands
---> 67 return _registry.get(self.command)
        _registry = <npe2._command_registry.CommandRegistry object at 0x000001E7882EAD50>
        self.command = 'ultrack.main_widget'
        self = WidgetContribution(command='ultrack.main_widget', display_name='Ultrack', autogenerate=False)
File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\npe2\_command_registry.py:139, in CommandRegistry.get(self=<npe2._command_registry.CommandRegistry object>, id='ultrack.main_widget')
    137     if id not in self._commands:  # sourcery skip
    138         raise KeyError(f"command {id!r} not registered")
--> 139 return self._commands[id].resolve()
        id = 'ultrack.main_widget'
        self._commands = {'ultrack.get_reader': CommandHandler(id='ultrack.get_reader', function=None, python_name='ultrack.reader.napari_reader:napari_get_reader'), 'ultrack.main_widget': CommandHandler(id='ultrack.main_widget', function=None, python_name='ultrack.widgets:UltrackWidget'), 'ultrack.hierarchy_viz_widget': CommandHandler(id='ultrack.hierarchy_viz_widget', function=None, python_name='ultrack.widgets:HierarchyVizWidget'), 'napari-bioformats.read_file': CommandHandler(id='napari-bioformats.read_file', function=<function get_reader at 0x000001E7BD88EC00>, python_name='napari_bioformats._plugin:get_reader')}
        self = <npe2._command_registry.CommandRegistry object at 0x000001E7882EAD50>
        self._commands[id] = CommandHandler(id='ultrack.main_widget', function=None, python_name='ultrack.widgets:UltrackWidget')
File ~\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\npe2\_command_registry.py:35, in CommandHandler.resolve(self=CommandHandler(id='ultrack.main_widget', function=None, python_name='ultrack.widgets:UltrackWidget'))
     33     self.function = utils.import_python_name(self.python_name)
     34 except Exception as e:
---> 35     raise RuntimeError(
        self.python_name = 'ultrack.widgets:UltrackWidget'
        self = CommandHandler(id='ultrack.main_widget', function=None, python_name='ultrack.widgets:UltrackWidget')     36         f"Failed to import command at {self.python_name!r}: {e}"
     37     ) from e
     39 return self.function

RuntimeError: Failed to import command at 'ultrack.widgets:UltrackWidget': [WinError 127] The specified procedure could not be found. Error loading "C:\Users\smcardle\AppData\Local\napari-0.7.0\envs\napari-0.7.0\Lib\site-packages\torch\lib\shm.dll" or one of its dependencies.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions