Cope 2.5.0
My personal "standard library" of all the generally useful code I've written for various projects over the years
Loading...
Searching...
No Matches
imports.py
1from typing import Union, Iterable, Literal
2import importlib
3from varname import nameof
4import importlib.util
5import sys
6import logging
7
8# depricated
9def installLib(libs:Iterable):
10 libs = ' '.join(libs)
11
12 def useSubprocess():
13 import subprocess
14 print(subprocess.check_output(f"pip install {libs}", shell=True, text=True))
15
16 try:
17 import IPython
18 except:
19 useSubprocess()
20 else:
21 if (ipython := IPython.get_ipython()) is not None:
22 ipython.run_line_magic("pip", f"install {libs}")
23 else:
24 useSubprocess()
25
26# depricated
27def niceInstallLib(libs:Iterable):
28 if input(f'Would you like to install {" ".join(libs)}? (y/n): ').lower() == 'y':
29 installLib(libs)
30
31# depricated
32def ensureImported(package:str, specificModules=[], as_=None,
33 if_unavailable:Literal['auto', 'warn', 'error']='auto',
34 _globals=globals(),
35 _locals=locals(),
36 level=0,
37 ) -> bool:
38 # Parameter handling
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')
43
44 try:
45 imported = __import__(package, _globals, _locals, specificModules, level)
46 except ImportError:
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}")')
54 else:
55 print(f'Can\'t import {package}. Have you installed the associated pip package? (try "pip install {pacakge}")')
56 return False
57 elif if_unavailable == 'error':
58 raise ImportError(package)
59 return False
60 else:
61 raise TypeError(f'Unknown if_unavailable value given: {if_unavailable}')
62 return False
63 else:
64 if len(specificModules):
65 # print('returning imported')
66 # return imported
67 for i in specificModules:
68 _globals[i] = imported.__getattribute__(i)
69 # globals()[as_ if as_ else specificModules[-1]] = imported.__getattribute__(specificModules[-1])
70 else:
71 _globals[as_ if as_ else package] = imported
72 return True
73
74# TODO: Rewrite this
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)":
79 # todo()
80 return
81 if type(specificModules) is str:
82 specificModules = [specificModules]
83 try:
84 _temp = __import__(package, _globals, _locals, specificModules, level)
85 except ImportError:
86 if type(printWarning) is str:
87 print(printWarning)
88 elif printWarning:
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}")')
91 else:
92 print(f'Can\'t import {package}. Have you installed the associated pip package? (try "pip install {pacakge}")')
93 if fatal:
94 raise ImportError(package)
95 return False
96 else:
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])
101 else:
102 globals()[_as if _as else package] = _temp
103 return True
104
105# depricated
106def dependsOnPackage(package:str, specificModules=[], as_=None,
107 if_unavailable:Literal['auto', 'warn', 'error']='auto',
108 _globals=globals(), _locals=locals(),
109 level=0):
110 def wrap(func):
111 def innerWrap(*funcArgs, **funcKwArgs):
112 if ensureImported(package, specificModules, as_, if_unavailable, globals, locals, level):
113 return func(*funcArgs, **funcKwArgs)
114 else:
115 print(f'Failed to import {package} for {nameof(func)}')
116 return None
117 return innerWrap
118 return wrap
119
120
121# TODO: tests
122def importpath(path, name):
123 """ Import a specific script as a module
124 from https://docs.python.org/3/library/importlib.html
125 """
126 spec = importlib.util.spec_from_file_location(name, path)
127 module = importlib.util.module_from_spec(spec)
128 # sys.modules[spec.name] = module
129 sys.modules[name] = module
130 spec.loader.exec_module(module)
131 # TODO: I'm not sure this will work, I think I'm doing it wrong
132 return importlib.import_module(name, name)
133
134 # This is kinda ugly and nasty, but it works. For now.
135 # globals()[moduleName] = importlib.import_module(
136 # name, moduleName).__getattribute__(moduleName)