Skip to content

Commit 7dbbdca

Browse files
authored
Bugfix in list_engine (#4811)
* fix list_engine * fix store engine and netcdf4 * reve * revert changes in guess_engine * add resister of backend if dependencies aere instralled * style mypy * fix import * use import instead of importlib * black * replace ImportError with ModuleNotFoundError * fix typo * fix typos * remove else * Revert remove imports inside backends functions * Revert remove imports inside cfgrib * modify check on imports inside the backends * remove not used import
1 parent 2956067 commit 7dbbdca

12 files changed

+141
-44
lines changed

xarray/backends/cfgrib_.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,23 @@
55
from ..core import indexing
66
from ..core.utils import Frozen, FrozenDict, close_on_error
77
from ..core.variable import Variable
8-
from .common import AbstractDataStore, BackendArray, BackendEntrypoint
8+
from .common import (
9+
BACKEND_ENTRYPOINTS,
10+
AbstractDataStore,
11+
BackendArray,
12+
BackendEntrypoint,
13+
)
914
from .locks import SerializableLock, ensure_lock
1015
from .store import open_backend_dataset_store
1116

17+
try:
18+
import cfgrib
19+
20+
has_cfgrib = True
21+
except ModuleNotFoundError:
22+
has_cfgrib = False
23+
24+
1225
# FIXME: Add a dedicated lock, even if ecCodes is supposed to be thread-safe
1326
# in most circumstances. See:
1427
# https://confluence.ecmwf.int/display/ECC/Frequently+Asked+Questions
@@ -38,7 +51,6 @@ class CfGribDataStore(AbstractDataStore):
3851
"""
3952

4053
def __init__(self, filename, lock=None, **backend_kwargs):
41-
import cfgrib
4254

4355
if lock is None:
4456
lock = ECCODES_LOCK
@@ -129,3 +141,7 @@ def open_backend_dataset_cfgrib(
129141
cfgrib_backend = BackendEntrypoint(
130142
open_dataset=open_backend_dataset_cfgrib, guess_can_open=guess_can_open_cfgrib
131143
)
144+
145+
146+
if has_cfgrib:
147+
BACKEND_ENTRYPOINTS["cfgrib"] = cfgrib_backend

xarray/backends/common.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import time
33
import traceback
4+
from typing import Dict
45

56
import numpy as np
67

@@ -349,3 +350,6 @@ def __init__(self, open_dataset, open_dataset_parameters=None, guess_can_open=No
349350
self.open_dataset = open_dataset
350351
self.open_dataset_parameters = open_dataset_parameters
351352
self.guess_can_open = guess_can_open
353+
354+
355+
BACKEND_ENTRYPOINTS: Dict[str, BackendEntrypoint] = {}

xarray/backends/h5netcdf_.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
from ..core import indexing
99
from ..core.utils import FrozenDict, is_remote_uri, read_magic_number
1010
from ..core.variable import Variable
11-
from .common import BackendEntrypoint, WritableCFDataStore, find_root_and_group
11+
from .common import (
12+
BACKEND_ENTRYPOINTS,
13+
BackendEntrypoint,
14+
WritableCFDataStore,
15+
find_root_and_group,
16+
)
1217
from .file_manager import CachingFileManager, DummyFileManager
1318
from .locks import HDF5_LOCK, combine_locks, ensure_lock, get_write_lock
1419
from .netCDF4_ import (
@@ -20,6 +25,13 @@
2025
)
2126
from .store import open_backend_dataset_store
2227

28+
try:
29+
import h5netcdf
30+
31+
has_h5netcdf = True
32+
except ModuleNotFoundError:
33+
has_h5netcdf = False
34+
2335

2436
class H5NetCDFArrayWrapper(BaseNetCDF4Array):
2537
def get_array(self, needs_lock=True):
@@ -85,8 +97,6 @@ class H5NetCDFStore(WritableCFDataStore):
8597

8698
def __init__(self, manager, group=None, mode=None, lock=HDF5_LOCK, autoclose=False):
8799

88-
import h5netcdf
89-
90100
if isinstance(manager, (h5netcdf.File, h5netcdf.Group)):
91101
if group is None:
92102
root, group = find_root_and_group(manager)
@@ -122,7 +132,6 @@ def open(
122132
invalid_netcdf=None,
123133
phony_dims=None,
124134
):
125-
import h5netcdf
126135

127136
if isinstance(filename, bytes):
128137
raise ValueError(
@@ -375,3 +384,6 @@ def open_backend_dataset_h5netcdf(
375384
h5netcdf_backend = BackendEntrypoint(
376385
open_dataset=open_backend_dataset_h5netcdf, guess_can_open=guess_can_open_h5netcdf
377386
)
387+
388+
if has_h5netcdf:
389+
BACKEND_ENTRYPOINTS["h5netcdf"] = h5netcdf_backend

xarray/backends/netCDF4_.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from ..core.utils import FrozenDict, close_on_error, is_remote_uri
1313
from ..core.variable import Variable
1414
from .common import (
15+
BACKEND_ENTRYPOINTS,
1516
BackendArray,
1617
BackendEntrypoint,
1718
WritableCFDataStore,
@@ -23,6 +24,14 @@
2324
from .netcdf3 import encode_nc3_attr_value, encode_nc3_variable
2425
from .store import open_backend_dataset_store
2526

27+
try:
28+
import netCDF4
29+
30+
has_netcdf4 = True
31+
except ModuleNotFoundError:
32+
has_netcdf4 = False
33+
34+
2635
# This lookup table maps from dtype.byteorder to a readable endian
2736
# string used by netCDF4.
2837
_endian_lookup = {"=": "native", ">": "big", "<": "little", "|": "native"}
@@ -298,7 +307,6 @@ class NetCDF4DataStore(WritableCFDataStore):
298307
def __init__(
299308
self, manager, group=None, mode=None, lock=NETCDF4_PYTHON_LOCK, autoclose=False
300309
):
301-
import netCDF4
302310

303311
if isinstance(manager, netCDF4.Dataset):
304312
if group is None:
@@ -335,7 +343,6 @@ def open(
335343
lock_maker=None,
336344
autoclose=False,
337345
):
338-
import netCDF4
339346

340347
if isinstance(filename, pathlib.Path):
341348
filename = os.fspath(filename)
@@ -563,3 +570,7 @@ def open_backend_dataset_netcdf4(
563570
netcdf4_backend = BackendEntrypoint(
564571
open_dataset=open_backend_dataset_netcdf4, guess_can_open=guess_can_open_netcdf4
565572
)
573+
574+
575+
if has_netcdf4:
576+
BACKEND_ENTRYPOINTS["netcdf4"] = netcdf4_backend

xarray/backends/plugins.py

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,11 @@
22
import inspect
33
import itertools
44
import logging
5-
import typing as T
65
import warnings
76

87
import pkg_resources
98

10-
from .cfgrib_ import cfgrib_backend
11-
from .common import BackendEntrypoint
12-
from .h5netcdf_ import h5netcdf_backend
13-
from .netCDF4_ import netcdf4_backend
14-
from .pseudonetcdf_ import pseudonetcdf_backend
15-
from .pydap_ import pydap_backend
16-
from .pynio_ import pynio_backend
17-
from .scipy_ import scipy_backend
18-
from .store import store_backend
19-
from .zarr import zarr_backend
20-
21-
BACKEND_ENTRYPOINTS: T.Dict[str, BackendEntrypoint] = {
22-
"store": store_backend,
23-
"netcdf4": netcdf4_backend,
24-
"h5netcdf": h5netcdf_backend,
25-
"scipy": scipy_backend,
26-
"pseudonetcdf": pseudonetcdf_backend,
27-
"zarr": zarr_backend,
28-
"cfgrib": cfgrib_backend,
29-
"pydap": pydap_backend,
30-
"pynio": pynio_backend,
31-
}
9+
from .common import BACKEND_ENTRYPOINTS
3210

3311

3412
def remove_duplicates(backend_entrypoints):

xarray/backends/pseudonetcdf_.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,24 @@
33
from ..core import indexing
44
from ..core.utils import Frozen, FrozenDict, close_on_error
55
from ..core.variable import Variable
6-
from .common import AbstractDataStore, BackendArray, BackendEntrypoint
6+
from .common import (
7+
BACKEND_ENTRYPOINTS,
8+
AbstractDataStore,
9+
BackendArray,
10+
BackendEntrypoint,
11+
)
712
from .file_manager import CachingFileManager
813
from .locks import HDF5_LOCK, NETCDFC_LOCK, combine_locks, ensure_lock
914
from .store import open_backend_dataset_store
1015

16+
try:
17+
from PseudoNetCDF import pncopen
18+
19+
has_pseudonetcdf = True
20+
except ModuleNotFoundError:
21+
has_pseudonetcdf = False
22+
23+
1124
# psuedonetcdf can invoke netCDF libraries internally
1225
PNETCDF_LOCK = combine_locks([HDF5_LOCK, NETCDFC_LOCK])
1326

@@ -40,7 +53,6 @@ class PseudoNetCDFDataStore(AbstractDataStore):
4053

4154
@classmethod
4255
def open(cls, filename, lock=None, mode=None, **format_kwargs):
43-
from PseudoNetCDF import pncopen
4456

4557
keywords = {"kwargs": format_kwargs}
4658
# only include mode if explicitly passed
@@ -138,3 +150,7 @@ def open_backend_dataset_pseudonetcdf(
138150
open_dataset=open_backend_dataset_pseudonetcdf,
139151
open_dataset_parameters=open_dataset_parameters,
140152
)
153+
154+
155+
if has_pseudonetcdf:
156+
BACKEND_ENTRYPOINTS["pseudonetcdf"] = pseudonetcdf_backend

xarray/backends/pydap_.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,22 @@
44
from ..core.pycompat import integer_types
55
from ..core.utils import Frozen, FrozenDict, close_on_error, is_dict_like, is_remote_uri
66
from ..core.variable import Variable
7-
from .common import AbstractDataStore, BackendArray, BackendEntrypoint, robust_getitem
7+
from .common import (
8+
BACKEND_ENTRYPOINTS,
9+
AbstractDataStore,
10+
BackendArray,
11+
BackendEntrypoint,
12+
robust_getitem,
13+
)
814
from .store import open_backend_dataset_store
915

16+
try:
17+
import pydap.client
18+
19+
has_pydap = True
20+
except ModuleNotFoundError:
21+
has_pydap = False
22+
1023

1124
class PydapArrayWrapper(BackendArray):
1225
def __init__(self, array):
@@ -74,7 +87,6 @@ def __init__(self, ds):
7487

7588
@classmethod
7689
def open(cls, url, session=None):
77-
import pydap.client
7890

7991
ds = pydap.client.open_url(url, session=session)
8092
return cls(ds)
@@ -133,3 +145,7 @@ def open_backend_dataset_pydap(
133145
pydap_backend = BackendEntrypoint(
134146
open_dataset=open_backend_dataset_pydap, guess_can_open=guess_can_open_pydap
135147
)
148+
149+
150+
if has_pydap:
151+
BACKEND_ENTRYPOINTS["pydap"] = pydap_backend

xarray/backends/pynio_.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,24 @@
33
from ..core import indexing
44
from ..core.utils import Frozen, FrozenDict, close_on_error
55
from ..core.variable import Variable
6-
from .common import AbstractDataStore, BackendArray, BackendEntrypoint
6+
from .common import (
7+
BACKEND_ENTRYPOINTS,
8+
AbstractDataStore,
9+
BackendArray,
10+
BackendEntrypoint,
11+
)
712
from .file_manager import CachingFileManager
813
from .locks import HDF5_LOCK, NETCDFC_LOCK, SerializableLock, combine_locks, ensure_lock
914
from .store import open_backend_dataset_store
1015

16+
try:
17+
import Nio
18+
19+
has_pynio = True
20+
except ModuleNotFoundError:
21+
has_pynio = False
22+
23+
1124
# PyNIO can invoke netCDF libraries internally
1225
# Add a dedicated lock just in case NCL as well isn't thread-safe.
1326
NCL_LOCK = SerializableLock()
@@ -45,7 +58,6 @@ class NioDataStore(AbstractDataStore):
4558
"""Store for accessing datasets via PyNIO"""
4659

4760
def __init__(self, filename, mode="r", lock=None, **kwargs):
48-
import Nio
4961

5062
if lock is None:
5163
lock = PYNIO_LOCK
@@ -119,3 +131,7 @@ def open_backend_dataset_pynio(
119131

120132

121133
pynio_backend = BackendEntrypoint(open_dataset=open_backend_dataset_pynio)
134+
135+
136+
if has_pynio:
137+
BACKEND_ENTRYPOINTS["pynio"] = pynio_backend

xarray/backends/scipy_.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,24 @@
66
from ..core.indexing import NumpyIndexingAdapter
77
from ..core.utils import Frozen, FrozenDict, close_on_error, read_magic_number
88
from ..core.variable import Variable
9-
from .common import BackendArray, BackendEntrypoint, WritableCFDataStore
9+
from .common import (
10+
BACKEND_ENTRYPOINTS,
11+
BackendArray,
12+
BackendEntrypoint,
13+
WritableCFDataStore,
14+
)
1015
from .file_manager import CachingFileManager, DummyFileManager
1116
from .locks import ensure_lock, get_write_lock
1217
from .netcdf3 import encode_nc3_attr_value, encode_nc3_variable, is_valid_nc3_name
1318
from .store import open_backend_dataset_store
1419

20+
try:
21+
import scipy.io
22+
23+
has_scipy = True
24+
except ModuleNotFoundError:
25+
has_scipy = False
26+
1527

1628
def _decode_string(s):
1729
if isinstance(s, bytes):
@@ -61,8 +73,6 @@ def __setitem__(self, key, value):
6173
def _open_scipy_netcdf(filename, mode, mmap, version):
6274
import gzip
6375

64-
import scipy.io
65-
6676
# if the string ends with .gz, then gunzip and open as netcdf file
6777
if isinstance(filename, str) and filename.endswith(".gz"):
6878
try:
@@ -271,3 +281,7 @@ def open_backend_dataset_scipy(
271281
scipy_backend = BackendEntrypoint(
272282
open_dataset=open_backend_dataset_scipy, guess_can_open=guess_can_open_scipy
273283
)
284+
285+
286+
if has_scipy:
287+
BACKEND_ENTRYPOINTS["scipy"] = scipy_backend

xarray/backends/store.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from .. import conventions
22
from ..core.dataset import Dataset
3-
from .common import AbstractDataStore, BackendEntrypoint
3+
from .common import BACKEND_ENTRYPOINTS, AbstractDataStore, BackendEntrypoint
44

55

66
def guess_can_open_store(store_spec):
@@ -44,3 +44,6 @@ def open_backend_dataset_store(
4444
store_backend = BackendEntrypoint(
4545
open_dataset=open_backend_dataset_store, guess_can_open=guess_can_open_store
4646
)
47+
48+
49+
BACKEND_ENTRYPOINTS["store"] = store_backend

0 commit comments

Comments
 (0)