Skip to content

Commit f100cae

Browse files
authored
fix: don’t double-open h5ad files in backed mode (#2274)
1 parent cde32b7 commit f100cae

3 files changed

Lines changed: 9 additions & 3 deletions

File tree

docs/release-notes/2274.fix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Only open HDF5 file once in backed mode {user}`flying-sheep`

src/anndata/_core/anndata.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,12 @@ def _init_as_actual( # noqa: PLR0912, PLR0913, PLR0915
364364

365365
# init from file
366366
if filename is not None:
367-
self.file = AnnDataFileManager(self, filename, filemode)
367+
fileobj, filename = (
368+
(filename, None)
369+
if isinstance(filename, h5py.File)
370+
else (None, filename)
371+
)
372+
self.file = AnnDataFileManager(self, filename, filemode, fileobj)
368373
else:
369374
self.file = AnnDataFileManager(self, None)
370375

src/anndata/_io/h5ad.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,8 @@ def write_sparse_as_dense(
170170
def read_h5ad_backed(
171171
filename: str | PathLike[str], mode: Literal["r", "r+"]
172172
) -> AnnData:
173-
d = dict(filename=filename, filemode=mode)
174-
175173
f = h5py.File(filename, mode)
174+
d = dict(filename=f)
176175

177176
attributes = ["obsm", "varm", "obsp", "varp", "uns", "layers"]
178177
df_attributes = ["obs", "var"]
@@ -189,6 +188,7 @@ def read_h5ad_backed(
189188
d["raw"] = _read_raw(f, attrs={"var", "varm"})
190189

191190
adata = AnnData(**d)
191+
assert adata.file._file is f
192192

193193
# Backwards compat to <0.7
194194
if isinstance(f["obs"], h5py.Dataset):

0 commit comments

Comments
 (0)