diff --git a/virttest/_wrappers.py b/virttest/_wrappers.py index e83cbd9843..7ca031f8f7 100644 --- a/virttest/_wrappers.py +++ b/virttest/_wrappers.py @@ -6,6 +6,7 @@ import sys import importlib +import importlib.util from importlib.machinery import (SourceFileLoader, SOURCE_SUFFIXES, SourcelessFileLoader, BYTECODE_SUFFIXES, ExtensionFileLoader, EXTENSION_SUFFIXES) @@ -70,3 +71,20 @@ def load_source(name, path): """ spec = importlib.util.spec_from_file_location(name, path) return _load_from_spec(spec) + + +def lazy_import(name): + """ Allows for an early import that is initialized upon use (lazy import). + + :param name: Name of the module that is going to be imported + :type name: String + """ + spec = importlib.util.find_spec(name) + if spec is None: + raise ImportError(f"Could not import module {name}") + loader = importlib.util.LazyLoader(spec.loader) + spec.loader = loader + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + loader.exec_module(module) + return module diff --git a/virttest/env_process.py b/virttest/env_process.py index b6aefdaec7..dbb99a65ee 100644 --- a/virttest/env_process.py +++ b/virttest/env_process.py @@ -34,12 +34,10 @@ from virttest import storage from virttest import utils_libguestfs from virttest import qemu_storage -from virttest import utils_libvirtd from virttest import data_dir from virttest import utils_net from virttest import nfs from virttest import libvirt_vm -from virttest import virsh from virttest import utils_test from virttest import utils_iptables from virttest import utils_package @@ -55,6 +53,12 @@ from virttest.test_setup.networking import NetworkProxies +# lazy imports for dependencies that are not needed in all modes of use +from virttest._wrappers import lazy_import +utils_libvirtd = lazy_import("virttest.utils_libvirtd") +virsh = lazy_import("virttest.virsh") + + try: import PIL.Image except ImportError: diff --git a/virttest/utils_libvirtd.py b/virttest/utils_libvirtd.py index 0642338b46..c1256ece45 100644 --- a/virttest/utils_libvirtd.py +++ b/virttest/utils_libvirtd.py @@ -56,6 +56,7 @@ def __init__(self, service_name=None, session=None, all_daemons=False): self.daemons = [] self.service_list = [] + # we only import this module conditionally to make this warning always applicable if LIBVIRTD is None: LOG.warning("Libvirtd service is not available in host, " "utils_libvirtd module will not function normally") diff --git a/virttest/virsh.py b/virttest/virsh.py index 234a3709f4..98517728bc 100644 --- a/virttest/virsh.py +++ b/virttest/virsh.py @@ -71,6 +71,7 @@ try: VIRSH_EXEC = path.find_command("virsh") except path.CmdNotFoundError: + # we only import this module conditionally to make this warning always applicable logging.getLogger('avocado.app').warning( "Virsh executable not set or found on path, virsh module will not " "function normally")