PEP 302 Loader that wraps Python's "classic" import algorithm
| 267 | |
| 268 | |
| 269 | class ImpLoader: |
| 270 | """PEP 302 Loader that wraps Python's "classic" import algorithm |
| 271 | """ |
| 272 | code = source = None |
| 273 | |
| 274 | def __init__(self, fullname, file, filename, etc): |
| 275 | warnings.warn("This emulation is deprecated and slated for removal in " |
| 276 | "Python 3.12; use 'importlib' instead", |
| 277 | DeprecationWarning) |
| 278 | _import_imp() |
| 279 | self.file = file |
| 280 | self.filename = filename |
| 281 | self.fullname = fullname |
| 282 | self.etc = etc |
| 283 | |
| 284 | def load_module(self, fullname): |
| 285 | self._reopen() |
| 286 | try: |
| 287 | mod = imp.load_module(fullname, self.file, self.filename, self.etc) |
| 288 | finally: |
| 289 | if self.file: |
| 290 | self.file.close() |
| 291 | # Note: we don't set __loader__ because we want the module to look |
| 292 | # normal; i.e. this is just a wrapper for standard import machinery |
| 293 | return mod |
| 294 | |
| 295 | def get_data(self, pathname): |
| 296 | with open(pathname, "rb") as file: |
| 297 | return file.read() |
| 298 | |
| 299 | def _reopen(self): |
| 300 | if self.file and self.file.closed: |
| 301 | mod_type = self.etc[2] |
| 302 | if mod_type==imp.PY_SOURCE: |
| 303 | self.file = open(self.filename, 'r') |
| 304 | elif mod_type in (imp.PY_COMPILED, imp.C_EXTENSION): |
| 305 | self.file = open(self.filename, 'rb') |
| 306 | |
| 307 | def _fix_name(self, fullname): |
| 308 | if fullname is None: |
| 309 | fullname = self.fullname |
| 310 | elif fullname != self.fullname: |
| 311 | raise ImportError("Loader for module %s cannot handle " |
| 312 | "module %s" % (self.fullname, fullname)) |
| 313 | return fullname |
| 314 | |
| 315 | def is_package(self, fullname): |
| 316 | fullname = self._fix_name(fullname) |
| 317 | return self.etc[2]==imp.PKG_DIRECTORY |
| 318 | |
| 319 | def get_code(self, fullname=None): |
| 320 | fullname = self._fix_name(fullname) |
| 321 | if self.code is None: |
| 322 | mod_type = self.etc[2] |
| 323 | if mod_type==imp.PY_SOURCE: |
| 324 | source = self.get_source(fullname) |
| 325 | self.code = compile(source, self.filename, 'exec') |
| 326 | elif mod_type==imp.PY_COMPILED: |