Skip to content

Copying groups containing external links #205

@rayosborn

Description

@rayosborn

I have not fully diagnosed this problem, but when attempting to copy an NXdata group that contained external links, the following exception was raised by h5py.

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
File ~/Documents/Computing/Repositories/nexpy/src/nexpy/gui/mainwindow.py:1600, in MainWindow.copy_data(self)
   1598 node = self.treeview.get_node()
   1599 if not isinstance(node, NXroot):
-> 1600     self.copied_node = self.copy_node(node)
   1601     logging.info(f"'{node.nxpath}' copied")
   1602 else:

File ~/Documents/Computing/Repositories/nexpy/src/nexpy/gui/mainwindow.py:1584, in MainWindow.copy_node(self, node)
   1582 if isinstance(node, NXlink):
   1583     node = node.nxlink
-> 1584 self._memroot['entry'][node.nxname] = node
   1585 self._memroot['entry'].attrs['link'] = [node.nxname, node.nxpath,
   1586                                         str(node.nxfilename)]
   1587 return self._memroot['entry'][node.nxname]

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:4626, in NXgroup.__setitem__(self, key, value)
   4623 elif (isinstance(group.entries[key], NXentry) and
   4624       not isinstance(group, NXroot)):
   4625     group.entries[key].nxclass = NXsubentry
-> 4626 group.entries[key].update()

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:4725, in NXgroup.update(self)
   4723 if self.nxfilemode == 'rw':
   4724     with self.nxfile as f:
-> 4725         f.update(self)
   4726 elif self.nxfilemode is None:
   4727     for node in self.walk():

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:1336, in NXFile.update(self, item)
   1334     self._writedata(item)
   1335 elif isinstance(item, NXgroup):
-> 1336     links = self._writegroup(item)
   1337     self._writelinks(links)
   1338 elif isinstance(item, NXobject):

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:1020, in NXFile._writegroup(self, group)
   1017         links += [(self.nxpath+"/"+child.nxname, child._target,
   1018                    child._soft)]
   1019 elif isinstance(child, NXfield):
-> 1020     links += self._writedata(child)
   1021 else:
   1022     links += self._writegroup(child)

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:1060, in NXFile._writedata(self, data)
   1058 if _file._filename != self._filename:
   1059     with _file as f:
-> 1060         f.copy(_path, self[self.nxparent], name=self.nxpath)
   1061 else:
   1062     self.copy(_path, self[self.nxparent], name=self.nxpath)

File ~/Documents/Computing/Repositories/nexusformat/src/nexusformat/nexus/tree.py:1281, in NXFile.copy(self, source, destination, **kwargs)
   1268 def copy(self, source, destination, **kwargs):
   1269     """Copy an object defined by its path to another location.
   1270 
   1271     This is an interface to the `h5py.Group` copy function. All the
   (...)
   1279         Path of the new copy.
   1280     """
-> 1281     self.file.copy(source, destination, **kwargs)

File ~/opt/miniconda3/envs/py310/lib/python3.10/site-packages/h5py/_hl/group.py:597, in Group.copy(self, source, dest, name, shallow, expand_soft, expand_external, expand_refs, without_attrs)
    594 else:
    595     copypl = None
--> 597 h5o.copy(source.id, self._e(source_path), dest.id, self._e(dest_path),
    598          copypl, base.dlcpl)

File h5py/_objects.pyx:54, in h5py._objects.with_phil.wrapper()

File h5py/_objects.pyx:55, in h5py._objects.with_phil.wrapper()

File h5py/h5o.pyx:217, in h5py.h5o.copy()

RuntimeError: Unable to synchronously copy object (object 'signal' doesn't exist)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions