in tools/toollib/import_analyzer.py [0:0]
def _check_std_lib(modules):
external = set()
std_libs = set()
imp_errors = set()
paths = {p.casefold() for p in sys.path}
paths.update({str(Path(p).resolve()).casefold() for p in sys.path})
stdlib_paths = {
p
for p in paths
if p.startswith(sys.prefix.casefold()) and "site-packages" not in p
}
for mod_name in modules:
if mod_name not in sys.modules:
try:
import_module(mod_name)
except ImportError:
imp_errors.add(mod_name)
continue
except Exception as err: # pylint: disable=broad-except
print(f"Unexpected exception importing {mod_name}")
print(err)
imp_errors.add(mod_name)
continue
module = sys.modules[mod_name]
stdlib_module = _check_stdlib_path(module, mod_name, stdlib_paths)
if stdlib_module:
std_libs.add(mod_name)
continue
parts = mod_name.split(".")
for i, part in enumerate(parts):
partial = ".".join(parts[:i] + [part])
if partial in external or partial in std_libs:
# already listed or exempted
break
if partial in sys.modules and sys.modules[partial]:
# if match, add as external import
external.add(mod_name)
break
return std_libs, external, imp_errors