1from typing
import Union, Iterable, Literal
3from varname
import nameof
9def installLib(libs:Iterable):
14 print(subprocess.check_output(f
"pip install {libs}", shell=
True, text=
True))
21 if (ipython := IPython.get_ipython())
is not None:
22 ipython.run_line_magic(
"pip", f
"install {libs}")
27def niceInstallLib(libs:Iterable):
28 if input(f
'Would you like to install {" ".join(libs)}? (y/n): ').lower() ==
'y':
32def ensureImported(package:str, specificModules=[], as_=
None,
33 if_unavailable:Literal[
'auto',
'warn',
'error']=
'auto',
39 if type(specificModules)
is str:
40 specificModules = [specificModules]
41 if len(specificModules) > 1
and as_
is not None:
42 raise TypeError(
'You cant specify both an as_ parameter and multiple specificModules')
45 imported = __import__(package, _globals, _locals, specificModules, level)
47 if if_unavailable ==
'auto':
48 print(f
'It doesn\'t look like you have {package} installed. ', end=
'')
49 niceInstallLib((package,))
50 return ensureImported(package, specificModules, as_, if_unavailable, _globals, _locals, level)
51 elif if_unavailable ==
'warn':
52 if len(specificModules):
53 print(f
'Can\'t import {tuple(specificModules)} from {package}. Have you installed the associated pip package? (try "pip install {pacakge}")')
55 print(f
'Can\'t import {package}. Have you installed the associated pip package? (try "pip install {pacakge}")')
57 elif if_unavailable ==
'error':
58 raise ImportError(package)
61 raise TypeError(f
'Unknown if_unavailable value given: {if_unavailable}')
64 if len(specificModules):
67 for i
in specificModules:
68 _globals[i] = imported.__getattribute__(i)
71 _globals[as_
if as_
else package] = imported
75def checkImport(package:str, specificModules=[], _as=
None,
76 fatal:bool=
False, printWarning:Union[str, bool]=
True,
77 _globals=globals(), _locals=locals(), level=0
78 ) ->
"(Union[package, (packages,)], worked)":
81 if type(specificModules)
is str:
82 specificModules = [specificModules]
84 _temp = __import__(package, _globals, _locals, specificModules, level)
86 if type(printWarning)
is str:
89 if len(specificModules):
90 print(f
'Can\'t import {tuple(specificModules)} from {package}. Have you installed the associated pip package? (try "pip install {pacakge}")')
92 print(f
'Can\'t import {package}. Have you installed the associated pip package? (try "pip install {pacakge}")')
94 raise ImportError(package)
97 if len(specificModules):
98 for i
in specificModules[:-1]:
99 globals()[i] = _temp.__getattribute__(i)
100 globals()[_as
if _as
else specificModules[-1]] = _temp.__getattribute__(specificModules[-1])
102 globals()[_as
if _as
else package] = _temp
106def dependsOnPackage(package:str, specificModules=[], as_=
None,
107 if_unavailable:Literal[
'auto',
'warn',
'error']=
'auto',
108 _globals=globals(), _locals=locals(),
111 def innerWrap(*funcArgs, **funcKwArgs):
112 if ensureImported(package, specificModules, as_, if_unavailable, globals, locals, level):
113 return func(*funcArgs, **funcKwArgs)
115 print(f
'Failed to import {package} for {nameof(func)}')
122def importpath(path, name):
123 """ Import a specific script as a module
124 from https://docs.python.org/3/library/importlib.html
126 spec = importlib.util.spec_from_file_location(name, path)
127 module = importlib.util.module_from_spec(spec)
129 sys.modules[name] = module
130 spec.loader.exec_module(module)
132 return importlib.import_module(name, name)