Substitute __import__
with importlib.import_module
(#45965)
This commit is contained in:
parent
906799eec5
commit
47e79c32fd
@ -4,6 +4,7 @@
|
|||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
"""Common basic functions used through the spack.bootstrap package"""
|
"""Common basic functions used through the spack.bootstrap package"""
|
||||||
import fnmatch
|
import fnmatch
|
||||||
|
import importlib
|
||||||
import os.path
|
import os.path
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
@ -28,7 +29,7 @@
|
|||||||
|
|
||||||
def _python_import(module: str) -> bool:
|
def _python_import(module: str) -> bool:
|
||||||
try:
|
try:
|
||||||
__import__(module)
|
importlib.import_module(module)
|
||||||
except ImportError:
|
except ImportError:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import importlib
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
@ -114,8 +115,8 @@ def get_module(cmd_name):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Try to import the command from the built-in directory
|
# Try to import the command from the built-in directory
|
||||||
module_name = "%s.%s" % (__name__, pname)
|
module_name = f"{__name__}.{pname}"
|
||||||
module = __import__(module_name, fromlist=[pname, SETUP_PARSER, DESCRIPTION], level=0)
|
module = importlib.import_module(module_name)
|
||||||
tty.debug("Imported {0} from built-in commands".format(pname))
|
tty.debug("Imported {0} from built-in commands".format(pname))
|
||||||
except ImportError:
|
except ImportError:
|
||||||
module = spack.extensions.get_module(cmd_name)
|
module = spack.extensions.get_module(cmd_name)
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
system and configuring Spack to use multiple compilers.
|
system and configuring Spack to use multiple compilers.
|
||||||
"""
|
"""
|
||||||
import collections
|
import collections
|
||||||
|
import importlib
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import warnings
|
import warnings
|
||||||
@ -651,7 +652,7 @@ def class_for_compiler_name(compiler_name):
|
|||||||
submodule_name = compiler_name.replace("-", "_")
|
submodule_name = compiler_name.replace("-", "_")
|
||||||
|
|
||||||
module_name = ".".join(["spack", "compilers", submodule_name])
|
module_name = ".".join(["spack", "compilers", submodule_name])
|
||||||
module_obj = __import__(module_name, fromlist=[None])
|
module_obj = importlib.import_module(module_name)
|
||||||
cls = getattr(module_obj, mod_to_class(compiler_name))
|
cls = getattr(module_obj, mod_to_class(compiler_name))
|
||||||
|
|
||||||
# make a note of the name in the module so we can get to it easily.
|
# make a note of the name in the module so we can get to it easily.
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
systems (e.g. modules, lmod, etc.) or to add other custom
|
systems (e.g. modules, lmod, etc.) or to add other custom
|
||||||
features.
|
features.
|
||||||
"""
|
"""
|
||||||
|
import importlib
|
||||||
|
|
||||||
from llnl.util.lang import ensure_last, list_modules
|
from llnl.util.lang import ensure_last, list_modules
|
||||||
|
|
||||||
@ -46,11 +47,7 @@ def _populate_hooks(cls):
|
|||||||
|
|
||||||
for name in relative_names:
|
for name in relative_names:
|
||||||
module_name = __name__ + "." + name
|
module_name = __name__ + "." + name
|
||||||
# When importing a module from a package, __import__('A.B', ...)
|
module_obj = importlib.import_module(module_name)
|
||||||
# returns package A when 'fromlist' is empty. If fromlist is not
|
|
||||||
# empty it returns the submodule B instead
|
|
||||||
# See: https://stackoverflow.com/a/2725668/771663
|
|
||||||
module_obj = __import__(module_name, fromlist=[None])
|
|
||||||
cls._hooks.append((module_name, module_obj))
|
cls._hooks.append((module_name, module_obj))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
import functools
|
import functools
|
||||||
import glob
|
import glob
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import importlib
|
||||||
import inspect
|
import inspect
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
@ -868,7 +869,7 @@ def module(cls):
|
|||||||
We use this to add variables to package modules. This makes
|
We use this to add variables to package modules. This makes
|
||||||
install() methods easier to write (e.g., can call configure())
|
install() methods easier to write (e.g., can call configure())
|
||||||
"""
|
"""
|
||||||
return __import__(cls.__module__, fromlist=[cls.__name__])
|
return importlib.import_module(cls.__module__)
|
||||||
|
|
||||||
@classproperty
|
@classproperty
|
||||||
def namespace(cls):
|
def namespace(cls):
|
||||||
|
@ -365,9 +365,9 @@ def __init__(self, namespace):
|
|||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
"""Getattr lazily loads modules if they're not already loaded."""
|
"""Getattr lazily loads modules if they're not already loaded."""
|
||||||
submodule = self.__package__ + "." + name
|
submodule = f"{self.__package__}.{name}"
|
||||||
try:
|
try:
|
||||||
setattr(self, name, __import__(submodule))
|
setattr(self, name, importlib.import_module(submodule))
|
||||||
except ImportError:
|
except ImportError:
|
||||||
msg = "'{0}' object has no attribute {1}"
|
msg = "'{0}' object has no attribute {1}"
|
||||||
raise AttributeError(msg.format(type(self), name))
|
raise AttributeError(msg.format(type(self), name))
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
modifications to global state in memory that must be replicated in the
|
modifications to global state in memory that must be replicated in the
|
||||||
child process.
|
child process.
|
||||||
"""
|
"""
|
||||||
|
import importlib
|
||||||
import io
|
import io
|
||||||
import multiprocessing
|
import multiprocessing
|
||||||
import pickle
|
import pickle
|
||||||
@ -118,7 +118,7 @@ def __init__(self, module_patches, class_patches):
|
|||||||
def restore(self):
|
def restore(self):
|
||||||
for module_name, attr_name, value in self.module_patches:
|
for module_name, attr_name, value in self.module_patches:
|
||||||
value = pickle.load(value)
|
value = pickle.load(value)
|
||||||
module = __import__(module_name)
|
module = importlib.import_module(module_name)
|
||||||
setattr(module, attr_name, value)
|
setattr(module, attr_name, value)
|
||||||
for class_fqn, attr_name, value in self.class_patches:
|
for class_fqn, attr_name, value in self.class_patches:
|
||||||
value = pickle.load(value)
|
value = pickle.load(value)
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
|
|
||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
||||||
import inspect
|
|
||||||
|
|
||||||
import llnl.util.tty as tty
|
|
||||||
from llnl.util.lang import list_modules, memoized
|
|
||||||
|
|
||||||
from spack.util.naming import mod_to_class
|
|
||||||
|
|
||||||
__all__ = ["list_classes"]
|
|
||||||
|
|
||||||
|
|
||||||
@memoized
|
|
||||||
def list_classes(parent_module, mod_path):
|
|
||||||
"""Given a parent path (e.g., spack.platforms or spack.analyzers),
|
|
||||||
use list_modules to derive the module names, and then mod_to_class
|
|
||||||
to derive class names. Import the classes and return them in a list
|
|
||||||
"""
|
|
||||||
classes = []
|
|
||||||
|
|
||||||
for name in list_modules(mod_path):
|
|
||||||
mod_name = "%s.%s" % (parent_module, name)
|
|
||||||
class_name = mod_to_class(name)
|
|
||||||
mod = __import__(mod_name, fromlist=[class_name])
|
|
||||||
if not hasattr(mod, class_name):
|
|
||||||
tty.die("No class %s defined in %s" % (class_name, mod_name))
|
|
||||||
cls = getattr(mod, class_name)
|
|
||||||
if not inspect.isclass(cls):
|
|
||||||
tty.die("%s.%s is not a class" % (mod_name, class_name))
|
|
||||||
|
|
||||||
classes.append(cls)
|
|
||||||
|
|
||||||
return classes
|
|
Loading…
Reference in New Issue
Block a user