imports.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.utils.import
  4. ~~~~~~~~~~~~~~~~~~~
  5. Utilities related to importing modules and symbols by name.
  6. """
  7. from __future__ import absolute_import
  8. from __future__ import with_statement
  9. import imp as _imp
  10. import importlib
  11. import os
  12. import sys
  13. from contextlib import contextmanager
  14. from kombu.utils import symbol_by_name
  15. from .compat import reload
  16. class NotAPackage(Exception):
  17. pass
  18. if sys.version_info >= (3, 3): # pragma: no cover
  19. def qualname(obj):
  20. return obj.__qualname__
  21. else:
  22. def qualname(obj): # noqa
  23. if not hasattr(obj, '__name__') and hasattr(obj, '__class__'):
  24. return qualname(obj.__class__)
  25. return '%s.%s' % (obj.__module__, obj.__name__)
  26. def instantiate(name, *args, **kwargs):
  27. """Instantiate class by name.
  28. See :func:`symbol_by_name`.
  29. """
  30. return symbol_by_name(name)(*args, **kwargs)
  31. @contextmanager
  32. def cwd_in_path():
  33. cwd = os.getcwd()
  34. if cwd in sys.path:
  35. yield
  36. else:
  37. sys.path.insert(0, cwd)
  38. try:
  39. yield cwd
  40. finally:
  41. try:
  42. sys.path.remove(cwd)
  43. except ValueError: # pragma: no cover
  44. pass
  45. def find_module(module, path=None, imp=None):
  46. """Version of :func:`imp.find_module` supporting dots."""
  47. if imp is None:
  48. imp = importlib.import_module
  49. with cwd_in_path():
  50. if '.' in module:
  51. last = None
  52. parts = module.split('.')
  53. for i, part in enumerate(parts[:-1]):
  54. mpart = imp('.'.join(parts[:i + 1]))
  55. try:
  56. path = mpart.__path__
  57. except AttributeError:
  58. raise NotAPackage(module)
  59. last = _imp.find_module(parts[i + 1], path)
  60. return last
  61. return _imp.find_module(module)
  62. def import_from_cwd(module, imp=None, package=None):
  63. """Import module, but make sure it finds modules
  64. located in the current directory.
  65. Modules located in the current directory has
  66. precedence over modules located in `sys.path`.
  67. """
  68. if imp is None:
  69. imp = importlib.import_module
  70. with cwd_in_path():
  71. return imp(module, package=package)
  72. def reload_from_cwd(module, reloader=None):
  73. if reloader is None:
  74. reloader = reload
  75. with cwd_in_path():
  76. return reloader(module)
  77. def module_file(module):
  78. name = module.__file__
  79. return name[:-1] if name.endswith('.pyc') else name