scverse / spatialdata

An open and interoperable data framework for spatial omics data
https://spatialdata.scverse.org/
BSD 3-Clause "New" or "Revised" License
237 stars 45 forks source link

Cannot write sdata with tables to external SSD #776

Closed josenimo closed 1 week ago

josenimo commented 1 week ago

I cannot write my sdata objects to SSD if they contain a table element

If I try to write sdata with table to external drive I get the following traceback:

Traceback ```python --------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) Cell In[45], line 1 ----> 1 sdata.write(f"/Volumes/Extreme SSD/P26_BCCN/991_SpatialData_w_table.zarr") File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/spatialdata/_core/spatialdata.py:1159, in SpatialData.write(self, file_path, overwrite, consolidate_metadata, format) 1156 store.close() 1158 for element_type, element_name, element in self.gen_elements(): -> 1159 self._write_element( 1160 element=element, 1161 zarr_container_path=file_path, 1162 element_type=element_type, 1163 element_name=element_name, 1164 overwrite=False, 1165 format=format, 1166 ) 1168 if self.path != file_path: 1169 old_path = self.path File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/spatialdata/_core/spatialdata.py:1211, in SpatialData._write_element(self, element, zarr_container_path, element_type, element_name, overwrite, format) 1209 write_shapes(shapes=element, group=element_type_group, name=element_name, format=parsed["shapes"]) 1210 elif element_type == "tables": -> 1211 write_table(table=element, group=element_type_group, name=element_name, format=parsed["tables"]) 1212 else: 1213 raise ValueError(f"Unknown element type: {element_type}") File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/spatialdata/_io/io_table.py:89, in write_table(table, group, name, group_type, format) 87 else: 88 region, region_key, instance_key = (None, None, None) ---> 89 write_adata(group, name, table) # creates group[name] 90 tables_group = group[name] 91 tables_group.attrs["spatialdata-encoding-type"] = group_type File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/anndata/_io/specs/registry.py:482, in write_elem(store, k, elem, dataset_kwargs) 458 def write_elem( 459 store: GroupStorageType, 460 k: str, (...) 463 dataset_kwargs: Mapping[str, Any] = MappingProxyType({}), 464 ) -> None: 465 """ 466 Write an element to a storage group using anndata encoding. 467 (...) 480 E.g. for zarr this would be `chunks`, `compressor`. 481 """ --> 482 Writer(_REGISTRY).write_elem(store, k, elem, dataset_kwargs=dataset_kwargs) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/anndata/_io/utils.py:248, in report_write_key_on_error..func_wrapper(*args, **kwargs) 246 raise ValueError("No element found in args.") 247 try: --> 248 return func(*args, **kwargs) 249 except Exception as e: 250 path = _get_display_path(store) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/anndata/_io/specs/registry.py:350, in Writer.write_elem(self, store, k, elem, dataset_kwargs, modifiers) 348 store.clear() 349 elif k in store: --> 350 del store[k] 352 write_func = self.find_write_func(dest_type, elem, modifiers) 354 if self.callback is None: File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/hierarchy.py:517, in Group.__delitem__(self, item) 516 def __delitem__(self, item): --> 517 return self._write_op(self._delitem_nosync, item) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/hierarchy.py:952, in Group._write_op(self, f, *args, **kwargs) 949 lock = self._synchronizer[group_meta_key] 951 with lock: --> 952 return f(*args, **kwargs) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/hierarchy.py:524, in Group._delitem_nosync(self, item) 520 path = self._item_path(item) 521 if contains_array(self._store, path) or contains_group( 522 self._store, path, explicit_only=False 523 ): --> 524 rmdir(self._store, path) 525 else: 526 raise KeyError(item) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/storage.py:212, in rmdir(store, path) 209 store_version = getattr(store, "_store_version", 2) 210 if hasattr(store, "rmdir") and store.is_erasable(): # type: ignore 211 # pass through --> 212 store.rmdir(path) 213 else: 214 # slow version, delete one key at a time 215 if store_version == 2: File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/storage.py:1549, in FSStore.rmdir(self, path) 1547 store_path = self.dir_path(path) 1548 if self.fs.isdir(store_path): -> 1549 self.fs.rm(store_path, recursive=True) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/fsspec/implementations/local.py:172, in LocalFileSystem.rm(self, path, recursive, maxdepth) 170 if osp.abspath(p) == os.getcwd(): 171 raise ValueError("Cannot delete current working directory") --> 172 shutil.rmtree(p) 173 else: 174 os.remove(p) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/shutil.py:717, in rmtree(path, ignore_errors, onerror) 715 try: 716 if os.path.samestat(orig_st, os.fstat(fd)): --> 717 _rmtree_safe_fd(fd, path, onerror) 718 try: 719 os.rmdir(path) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/shutil.py:674, in _rmtree_safe_fd(topfd, path, onerror) 672 os.unlink(entry.name, dir_fd=topfd) 673 except OSError: --> 674 onerror(os.unlink, fullname, sys.exc_info()) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/shutil.py:672, in _rmtree_safe_fd(topfd, path, onerror) 670 else: 671 try: --> 672 os.unlink(entry.name, dir_fd=topfd) 673 except OSError: 674 onerror(os.unlink, fullname, sys.exc_info()) FileNotFoundError: [Errno 2] No such file or directory: '._.zgroup' Error raised while writing key 'imaging_table' of to /tables ```

Reproduce using the blobs dataset


from spatialdata.datasets import blobs
sdata = blobs()
sdata.write("/Volumes/Extreme SSD/P26_BCCN/blobs.zarr")
Blobs traceback ```python --------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) Cell In[50], line 1 ----> 1 sdata.write("/Volumes/Extreme SSD/P26_BCCN/blobs.zarr") File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/spatialdata/_core/spatialdata.py:1159, in SpatialData.write(self, file_path, overwrite, consolidate_metadata, format) 1156 store.close() 1158 for element_type, element_name, element in self.gen_elements(): -> 1159 self._write_element( 1160 element=element, 1161 zarr_container_path=file_path, 1162 element_type=element_type, 1163 element_name=element_name, 1164 overwrite=False, 1165 format=format, 1166 ) 1168 if self.path != file_path: 1169 old_path = self.path File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/spatialdata/_core/spatialdata.py:1211, in SpatialData._write_element(self, element, zarr_container_path, element_type, element_name, overwrite, format) 1209 write_shapes(shapes=element, group=element_type_group, name=element_name, format=parsed["shapes"]) 1210 elif element_type == "tables": -> 1211 write_table(table=element, group=element_type_group, name=element_name, format=parsed["tables"]) 1212 else: 1213 raise ValueError(f"Unknown element type: {element_type}") File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/spatialdata/_io/io_table.py:89, in write_table(table, group, name, group_type, format) 87 else: 88 region, region_key, instance_key = (None, None, None) ---> 89 write_adata(group, name, table) # creates group[name] 90 tables_group = group[name] 91 tables_group.attrs["spatialdata-encoding-type"] = group_type File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/anndata/_io/specs/registry.py:482, in write_elem(store, k, elem, dataset_kwargs) 458 def write_elem( 459 store: GroupStorageType, 460 k: str, (...) 463 dataset_kwargs: Mapping[str, Any] = MappingProxyType({}), 464 ) -> None: 465 """ 466 Write an element to a storage group using anndata encoding. 467 (...) 480 E.g. for zarr this would be `chunks`, `compressor`. 481 """ --> 482 Writer(_REGISTRY).write_elem(store, k, elem, dataset_kwargs=dataset_kwargs) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/anndata/_io/utils.py:248, in report_write_key_on_error..func_wrapper(*args, **kwargs) 246 raise ValueError("No element found in args.") 247 try: --> 248 return func(*args, **kwargs) 249 except Exception as e: 250 path = _get_display_path(store) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/anndata/_io/specs/registry.py:350, in Writer.write_elem(self, store, k, elem, dataset_kwargs, modifiers) 348 store.clear() 349 elif k in store: --> 350 del store[k] 352 write_func = self.find_write_func(dest_type, elem, modifiers) 354 if self.callback is None: File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/hierarchy.py:517, in Group.__delitem__(self, item) 516 def __delitem__(self, item): --> 517 return self._write_op(self._delitem_nosync, item) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/hierarchy.py:952, in Group._write_op(self, f, *args, **kwargs) 949 lock = self._synchronizer[group_meta_key] 951 with lock: --> 952 return f(*args, **kwargs) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/hierarchy.py:524, in Group._delitem_nosync(self, item) 520 path = self._item_path(item) 521 if contains_array(self._store, path) or contains_group( 522 self._store, path, explicit_only=False 523 ): --> 524 rmdir(self._store, path) 525 else: 526 raise KeyError(item) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/storage.py:212, in rmdir(store, path) 209 store_version = getattr(store, "_store_version", 2) 210 if hasattr(store, "rmdir") and store.is_erasable(): # type: ignore 211 # pass through --> 212 store.rmdir(path) 213 else: 214 # slow version, delete one key at a time 215 if store_version == 2: File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/zarr/storage.py:1549, in FSStore.rmdir(self, path) 1547 store_path = self.dir_path(path) 1548 if self.fs.isdir(store_path): -> 1549 self.fs.rm(store_path, recursive=True) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/site-packages/fsspec/implementations/local.py:172, in LocalFileSystem.rm(self, path, recursive, maxdepth) 170 if osp.abspath(p) == os.getcwd(): 171 raise ValueError("Cannot delete current working directory") --> 172 shutil.rmtree(p) 173 else: 174 os.remove(p) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/shutil.py:717, in rmtree(path, ignore_errors, onerror) 715 try: 716 if os.path.samestat(orig_st, os.fstat(fd)): --> 717 _rmtree_safe_fd(fd, path, onerror) 718 try: 719 os.rmdir(path) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/shutil.py:674, in _rmtree_safe_fd(topfd, path, onerror) 672 os.unlink(entry.name, dir_fd=topfd) 673 except OSError: --> 674 onerror(os.unlink, fullname, sys.exc_info()) File /opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata/lib/python3.10/shutil.py:672, in _rmtree_safe_fd(topfd, path, onerror) 670 else: 671 try: --> 672 os.unlink(entry.name, dir_fd=topfd) 673 except OSError: 674 onerror(os.unlink, fullname, sys.exc_info()) FileNotFoundError: [Errno 2] No such file or directory: '._.zgroup' Error raised while writing key 'table' of to /tables ```

Describe the bug I was incrementally creating a sdata with my data, parsed image, wrote it to SSD. Parsed and added Labels, wrote to SSD. Parsed and added anndata table, and trying write to SSD fails. this was replicated with blobs database.

Expected behavior Writing the sdata to an external drive

Mamba environment

``` # packages in environment at [/opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata](https://file+.vscode-resource.vscode-cdn.net/opt/homebrew/Caskroom/mambaforge/base/envs/spatialdata): # # Name Version Build Channel aiobotocore 2.5.4 pypi_0 pypi aiohappyeyeballs 2.4.3 pypi_0 pypi aiohttp 3.10.10 pypi_0 pypi aioitertools 0.12.0 pypi_0 pypi aiosignal 1.3.1 pypi_0 pypi alabaster 1.0.0 pypi_0 pypi anndata 0.11.0 pypi_0 pypi annotated-types 0.7.0 pypi_0 pypi anyio 4.6.2.post1 pyhd8ed1ab_0 conda-forge app-model 0.3.0 pypi_0 pypi appdirs 1.4.4 pypi_0 pypi appnope 0.1.4 pyhd8ed1ab_0 conda-forge argon2-cffi 23.1.0 pyhd8ed1ab_0 conda-forge argon2-cffi-bindings 21.2.0 py310h493c2e1_5 conda-forge array-api-compat 1.9.1 pypi_0 pypi arrow 1.3.0 pyhd8ed1ab_0 conda-forge asciitree 0.3.3 pypi_0 pypi asttokens 2.4.1 pyhd8ed1ab_0 conda-forge async-lru 2.0.4 pyhd8ed1ab_0 conda-forge async-timeout 4.0.3 pypi_0 pypi attrs 24.2.0 pyh71513ae_0 conda-forge babel 2.16.0 pyhd8ed1ab_0 conda-forge beautifulsoup4 4.12.3 pyha770c72_0 conda-forge bleach 6.2.0 pyhd8ed1ab_0 conda-forge botocore 1.31.17 pypi_0 pypi brotli-python 1.1.0 py310hb4ad77e_2 conda-forge build 1.2.2.post1 pypi_0 pypi bzip2 1.0.8 h99b78c6_7 conda-forge ca-certificates 2024.8.30 hf0a4a13_0 conda-forge cached-property 1.5.2 hd8ed1ab_1 conda-forge cached_property 1.5.2 pyha770c72_1 conda-forge cachey 0.2.1 pypi_0 pypi certifi 2024.8.30 pyhd8ed1ab_0 conda-forge cffi 1.17.1 py310h497396d_0 conda-forge charset-normalizer 3.4.0 pyhd8ed1ab_0 conda-forge click 8.1.7 pypi_0 pypi cloudpickle 3.1.0 pypi_0 pypi colorcet 3.1.0 pypi_0 pypi comm 0.2.2 pyhd8ed1ab_0 conda-forge contourpy 1.3.0 pypi_0 pypi cycler 0.12.1 pypi_0 pypi dask 2024.11.1 pypi_0 pypi dask-expr 1.1.18 pypi_0 pypi dask-image 2024.5.3 pypi_0 pypi datashader 0.16.3 pypi_0 pypi debugpy 1.8.8 py310h853098b_0 conda-forge decorator 5.1.1 pyhd8ed1ab_0 conda-forge defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge distributed 2024.11.1 pypi_0 pypi docstring-parser 0.16 pypi_0 pypi docutils 0.21.2 pypi_0 pypi entrypoints 0.4 pyhd8ed1ab_0 conda-forge exceptiongroup 1.2.2 pyhd8ed1ab_0 conda-forge executing 2.1.0 pyhd8ed1ab_0 conda-forge fasteners 0.19 pypi_0 pypi fcsparser 0.2.8 pypi_0 pypi flexcache 0.3 pypi_0 pypi flexparser 0.4 pypi_0 pypi fonttools 4.54.1 pypi_0 pypi fqdn 1.5.1 pyhd8ed1ab_0 conda-forge freetype-py 2.5.1 pypi_0 pypi frozenlist 1.5.0 pypi_0 pypi fsspec 2023.6.0 pypi_0 pypi geopandas 1.0.1 pypi_0 pypi h11 0.14.0 pyhd8ed1ab_0 conda-forge h2 4.1.0 pyhd8ed1ab_0 conda-forge h5py 3.12.1 pypi_0 pypi heapdict 1.0.1 pypi_0 pypi hpack 4.0.0 pyh9f0ad1d_0 conda-forge hsluv 5.0.4 pypi_0 pypi httpcore 1.0.6 pyhd8ed1ab_0 conda-forge httpx 0.27.2 pyhd8ed1ab_0 conda-forge hyperframe 6.0.1 pyhd8ed1ab_0 conda-forge idna 3.10 pyhd8ed1ab_0 conda-forge imagecodecs 2024.9.22 pypi_0 pypi imageio 2.36.0 pypi_0 pypi imagesize 1.4.1 pypi_0 pypi importlib-metadata 8.5.0 pyha770c72_0 conda-forge importlib_metadata 8.5.0 hd8ed1ab_0 conda-forge importlib_resources 6.4.5 pyhd8ed1ab_0 conda-forge in-n-out 0.2.1 pypi_0 pypi ipykernel 6.29.5 pyh57ce528_0 conda-forge ipython 8.29.0 pyh707e725_0 conda-forge isoduration 20.11.0 pyhd8ed1ab_0 conda-forge jedi 0.19.2 pyhff2d567_0 conda-forge jinja2 3.1.4 pyhd8ed1ab_0 conda-forge jmespath 1.0.1 pypi_0 pypi joblib 1.4.2 pypi_0 pypi json5 0.9.27 pyhff2d567_0 conda-forge jsonpointer 3.0.0 py310hbe9552e_1 conda-forge jsonschema 4.23.0 pyhd8ed1ab_0 conda-forge jsonschema-specifications 2024.10.1 pyhd8ed1ab_0 conda-forge jsonschema-with-format-nongpl 4.23.0 hd8ed1ab_0 conda-forge jupyter-lsp 2.2.5 pyhd8ed1ab_0 conda-forge jupyter_client 8.6.3 pyhd8ed1ab_0 conda-forge jupyter_core 5.7.2 pyh31011fe_1 conda-forge jupyter_events 0.10.0 pyhd8ed1ab_0 conda-forge jupyter_server 2.14.2 pyhd8ed1ab_0 conda-forge jupyter_server_terminals 0.5.3 pyhd8ed1ab_0 conda-forge jupyterlab 4.2.5 pyhd8ed1ab_0 conda-forge jupyterlab_pygments 0.3.0 pyhd8ed1ab_1 conda-forge jupyterlab_server 2.27.3 pyhd8ed1ab_0 conda-forge kiwisolver 1.4.7 pypi_0 pypi krb5 1.21.3 h237132a_0 conda-forge lamin-utils 0.13.7 pypi_0 pypi lazy-loader 0.4 pypi_0 pypi legacy-api-wrap 1.4 pypi_0 pypi libcxx 19.1.3 ha82da77_0 conda-forge libedit 3.1.20191231 hc8eb9b7_2 conda-forge libffi 3.4.2 h3422bc3_5 conda-forge libsodium 1.0.20 h99b78c6_0 conda-forge libsqlite 3.47.0 hbaaea75_1 conda-forge libzlib 1.3.1 h8359307_2 conda-forge llvmlite 0.43.0 pypi_0 pypi locket 1.0.0 pypi_0 pypi loguru 0.7.2 pypi_0 pypi magicgui 0.9.1 pypi_0 pypi markdown-it-py 3.0.0 pypi_0 pypi markupsafe 3.0.2 py310h5799be4_0 conda-forge matplotlib 3.9.2 pypi_0 pypi matplotlib-inline 0.1.7 pyhd8ed1ab_0 conda-forge matplotlib-scalebar 0.8.1 pypi_0 pypi mdurl 0.1.2 pypi_0 pypi mistune 3.0.2 pyhd8ed1ab_0 conda-forge msgpack 1.1.0 pypi_0 pypi multidict 6.1.0 pypi_0 pypi multipledispatch 1.0.0 pypi_0 pypi multiscale-spatial-image 1.0.1 pypi_0 pypi napari 0.5.4 pypi_0 pypi napari-console 0.1.1 pypi_0 pypi napari-matplotlib 3.0.0 pypi_0 pypi napari-plugin-engine 0.2.0 pypi_0 pypi napari-spatialdata 0.5.3 pypi_0 pypi napari-svg 0.2.0 pypi_0 pypi natsort 8.4.0 pypi_0 pypi nbclient 0.10.0 pyhd8ed1ab_0 conda-forge nbconvert-core 7.16.4 pyhd8ed1ab_1 conda-forge nbformat 5.10.4 pyhd8ed1ab_0 conda-forge ncurses 6.5 h7bae524_1 conda-forge nest-asyncio 1.6.0 pyhd8ed1ab_0 conda-forge networkx 3.4.2 pypi_0 pypi notebook 7.2.2 pyhd8ed1ab_0 conda-forge notebook-shim 0.2.4 pyhd8ed1ab_0 conda-forge npe2 0.7.7 pypi_0 pypi numba 0.60.0 pypi_0 pypi numcodecs 0.13.1 pypi_0 pypi numpy 1.26.4 pypi_0 pypi numpydoc 1.8.0 pypi_0 pypi ome-zarr 0.9.0 pypi_0 pypi openssl 3.3.2 h8359307_0 conda-forge overrides 7.7.0 pyhd8ed1ab_0 conda-forge packaging 24.2 pypi_0 pypi pandas 2.2.3 pypi_0 pypi pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge param 2.1.1 pypi_0 pypi parso 0.8.4 pyhd8ed1ab_0 conda-forge partd 1.4.2 pypi_0 pypi patsy 0.5.6 pypi_0 pypi pexpect 4.9.0 pyhd8ed1ab_0 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 11.0.0 pypi_0 pypi pims 0.7 pypi_0 pypi pint 0.24.4 pypi_0 pypi pip 24.3.1 pyh8b19718_0 conda-forge pkgutil-resolve-name 1.3.10 pyhd8ed1ab_1 conda-forge platformdirs 4.3.6 pyhd8ed1ab_0 conda-forge pooch 1.8.2 pypi_0 pypi prometheus_client 0.21.0 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.48 pyha770c72_0 conda-forge propcache 0.2.0 pypi_0 pypi psutil 6.1.0 py310hf9df320_0 conda-forge psygnal 0.11.1 pypi_0 pypi ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge pure_eval 0.2.3 pyhd8ed1ab_0 conda-forge pyarrow 18.0.0 pypi_0 pypi pyconify 0.1.6 pypi_0 pypi pycparser 2.22 pyhd8ed1ab_0 conda-forge pyct 0.5.0 pypi_0 pypi pydantic 2.9.2 pypi_0 pypi pydantic-compat 0.1.2 pypi_0 pypi pydantic-core 2.23.4 pypi_0 pypi pygments 2.18.0 pyhd8ed1ab_0 conda-forge pynndescent 0.5.13 pypi_0 pypi pyobjc-core 10.3.1 py310hb3dec1a_1 conda-forge pyobjc-framework-cocoa 10.3.1 py310hb3dec1a_1 conda-forge pyogrio 0.10.0 pypi_0 pypi pyopengl 3.1.7 pypi_0 pypi pyparsing 3.2.0 pypi_0 pypi pyproj 3.7.0 pypi_0 pypi pyproject-hooks 1.2.0 pypi_0 pypi pyqt5 5.15.11 pypi_0 pypi pyqt5-qt5 5.15.15 pypi_0 pypi pyqt5-sip 12.15.0 pypi_0 pypi pysocks 1.7.1 pyha2e5f31_6 conda-forge python 3.10.0 h43b31ca_3_cpython conda-forge python-dateutil 2.9.0.post0 pypi_0 pypi python-fastjsonschema 2.20.0 pyhd8ed1ab_0 conda-forge python-json-logger 2.0.7 pyhd8ed1ab_0 conda-forge python_abi 3.10 5_cp310 conda-forge pytz 2024.2 pyhd8ed1ab_0 conda-forge pyyaml 6.0.2 py310h493c2e1_1 conda-forge pyzmq 26.2.0 py310h82ef58e_3 conda-forge qtconsole 5.6.1 pypi_0 pypi qtpy 2.4.2 pypi_0 pypi readfcs 1.1.9 pypi_0 pypi readline 8.2 h92ec313_1 conda-forge referencing 0.35.1 pyhd8ed1ab_0 conda-forge requests 2.32.3 pyhd8ed1ab_0 conda-forge rfc3339-validator 0.1.4 pyhd8ed1ab_0 conda-forge rfc3986-validator 0.1.1 pyh9f0ad1d_0 conda-forge rich 13.9.4 pypi_0 pypi rpds-py 0.21.0 py310hde4708a_0 conda-forge s3fs 2023.6.0 pypi_0 pypi scanpy 1.10.3 pypi_0 pypi scikit-image 0.24.0 pypi_0 pypi scikit-learn 1.5.2 pypi_0 pypi scipy 1.12.0 pypi_0 pypi seaborn 0.13.2 pypi_0 pypi send2trash 1.8.3 pyh31c8845_0 conda-forge session-info 1.0.0 pypi_0 pypi setuptools 75.3.0 pyhd8ed1ab_0 conda-forge shapely 2.0.6 pypi_0 pypi shellingham 1.5.4 pypi_0 pypi six 1.16.0 pyh6c4a22f_0 conda-forge slicerator 1.1.0 pypi_0 pypi sniffio 1.3.1 pyhd8ed1ab_0 conda-forge snowballstemmer 2.2.0 pypi_0 pypi sortedcontainers 2.4.0 pypi_0 pypi soupsieve 2.5 pyhd8ed1ab_1 conda-forge spatial-image 1.1.0 pypi_0 pypi spatialdata 0.2.5.post0 pypi_0 pypi spatialdata-io 0.1.5 pypi_0 pypi spatialdata-plot 0.2.7 pypi_0 pypi sphinx 8.1.3 pypi_0 pypi sphinxcontrib-applehelp 2.0.0 pypi_0 pypi sphinxcontrib-devhelp 2.0.0 pypi_0 pypi sphinxcontrib-htmlhelp 2.1.0 pypi_0 pypi sphinxcontrib-jsmath 1.0.1 pypi_0 pypi sphinxcontrib-qthelp 2.0.0 pypi_0 pypi sphinxcontrib-serializinghtml 2.0.0 pypi_0 pypi sqlite 3.47.0 hcd14bea_1 conda-forge stack-data 0.6.3 pypi_0 pypi stack_data 0.6.2 pyhd8ed1ab_0 conda-forge statsmodels 0.14.4 pypi_0 pypi stdlib-list 0.11.0 pypi_0 pypi superqt 0.6.7 pypi_0 pypi tabulate 0.9.0 pypi_0 pypi tblib 3.0.0 pypi_0 pypi terminado 0.18.1 pyh31c8845_0 conda-forge threadpoolctl 3.5.0 pypi_0 pypi tifffile 2024.9.20 pypi_0 pypi tinycss2 1.4.0 pyhd8ed1ab_0 conda-forge tk 8.6.13 h5083fa2_1 conda-forge tomli 2.0.2 pyhd8ed1ab_0 conda-forge tomli-w 1.1.0 pypi_0 pypi toolz 1.0.0 pypi_0 pypi tornado 6.4.1 py310h493c2e1_1 conda-forge tqdm 4.67.0 pypi_0 pypi traitlets 5.14.3 pyhd8ed1ab_0 conda-forge typer 0.13.0 pypi_0 pypi types-python-dateutil 2.9.0.20241003 pyhff2d567_0 conda-forge typing-extensions 4.12.2 hd8ed1ab_0 conda-forge typing_extensions 4.12.2 pyha770c72_0 conda-forge typing_utils 0.1.0 pyhd8ed1ab_0 conda-forge tzdata 2024.2 pypi_0 pypi umap-learn 0.5.7 pypi_0 pypi uri-template 1.3.0 pyhd8ed1ab_0 conda-forge urllib3 1.26.20 pypi_0 pypi vispy 0.14.3 pypi_0 pypi wcwidth 0.2.13 pyhd8ed1ab_0 conda-forge webcolors 24.8.0 pyhd8ed1ab_0 conda-forge webencodings 0.5.1 pyhd8ed1ab_2 conda-forge websocket-client 1.8.0 pyhd8ed1ab_0 conda-forge wheel 0.45.0 pyhd8ed1ab_0 conda-forge wrapt 1.16.0 pypi_0 pypi xarray 2024.7.0 pypi_0 pypi xarray-dataclasses 1.8.0 pypi_0 pypi xarray-datatree 0.0.15 pypi_0 pypi xarray-schema 0.0.3 pypi_0 pypi xarray-spatial 0.4.0 pypi_0 pypi xz 5.2.6 h57fd34a_0 conda-forge yaml 0.2.5 h3422bc3_2 conda-forge yarl 1.17.1 pypi_0 pypi zarr 2.18.3 pypi_0 pypi zeromq 4.3.5 h9f5b81c_6 conda-forge zict 3.0.0 pypi_0 pypi zipp 3.21.0 pyhd8ed1ab_0 conda-forge zstandard 0.23.0 py310h2665a74_1 conda-forge zstd 1.5.6 hb46c0d2_0 conda-forge ```
josenimo commented 1 week ago

Update: For some reason, I was able to write a sdata with a anndata with an empty adata.obs. Looking some more

josenimo commented 1 week ago

so currently it works as expected.. oh well