|
|
import importlib |
|
|
|
|
|
|
|
|
class LazyModule: |
|
|
def __init__(self, name, pip_name=None, import_error_msg=None): |
|
|
self.name = name |
|
|
self.pip_name = pip_name or name |
|
|
self.import_error_msg = import_error_msg or ( |
|
|
f"This requires the {self.name} module. " |
|
|
f"You can install it via `pip install {self.pip_name}`" |
|
|
) |
|
|
self.module = None |
|
|
self._available = None |
|
|
|
|
|
@property |
|
|
def available(self): |
|
|
if self._available is None: |
|
|
try: |
|
|
self.initialize() |
|
|
self._available = True |
|
|
except ImportError: |
|
|
self._available = False |
|
|
return self._available |
|
|
|
|
|
def initialize(self): |
|
|
try: |
|
|
self.module = importlib.import_module(self.name) |
|
|
except ImportError: |
|
|
raise ImportError(self.import_error_msg) |
|
|
|
|
|
def __getattr__(self, name): |
|
|
if name == "_api_export_path": |
|
|
raise AttributeError |
|
|
if self.module is None: |
|
|
self.initialize() |
|
|
return getattr(self.module, name) |
|
|
|
|
|
def __repr__(self): |
|
|
return f"LazyModule({self.name})" |
|
|
|
|
|
|
|
|
tensorflow = LazyModule("tensorflow") |
|
|
gfile = LazyModule("tensorflow.io.gfile", pip_name="tensorflow") |
|
|
tensorflow_io = LazyModule("tensorflow_io") |
|
|
scipy = LazyModule("scipy") |
|
|
jax = LazyModule("jax") |
|
|
torch_xla = LazyModule( |
|
|
"torch_xla", |
|
|
import_error_msg=( |
|
|
"This requires the torch_xla module. You can install it via " |
|
|
"`pip install torch-xla`. Additionally, you may need to update " |
|
|
"LD_LIBRARY_PATH if necessary. Torch XLA builds a shared library, " |
|
|
"_XLAC.so, which needs to link to the version of Python it was built " |
|
|
"with. Use the following command to update LD_LIBRARY_PATH: " |
|
|
"`export LD_LIBRARY_PATH=<path to Python>/lib:$LD_LIBRARY_PATH`" |
|
|
), |
|
|
) |
|
|
optree = LazyModule("optree") |
|
|
dmtree = LazyModule("tree") |
|
|
tf2onnx = LazyModule("tf2onnx") |
|
|
|