1# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org) 2# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php 3 4""" 5'imports' a string -- converts a string to a Python object, importing 6any necessary modules and evaluating the expression. Everything 7before the : in an import expression is the module path; everything 8after is an expression to be evaluated in the namespace of that 9module. 10 11Alternately, if no : is present, then import the modules and get the 12attributes as necessary. Arbitrary expressions are not allowed in 13that case. 14""" 15 16def eval_import(s): 17 """ 18 Import a module, or import an object from a module. 19 20 A module name like ``foo.bar:baz()`` can be used, where 21 ``foo.bar`` is the module, and ``baz()`` is an expression 22 evaluated in the context of that module. Note this is not safe on 23 arbitrary strings because of the eval. 24 """ 25 if ':' not in s: 26 return simple_import(s) 27 module_name, expr = s.split(':', 1) 28 module = import_module(module_name) 29 obj = eval(expr, module.__dict__) 30 return obj 31 32def simple_import(s): 33 """ 34 Import a module, or import an object from a module. 35 36 A name like ``foo.bar.baz`` can be a module ``foo.bar.baz`` or a 37 module ``foo.bar`` with an object ``baz`` in it, or a module 38 ``foo`` with an object ``bar`` with an attribute ``baz``. 39 """ 40 parts = s.split('.') 41 module = import_module(parts[0]) 42 name = parts[0] 43 parts = parts[1:] 44 last_import_error = None 45 while parts: 46 name += '.' + parts[0] 47 try: 48 module = import_module(name) 49 parts = parts[1:] 50 except ImportError as e: 51 last_import_error = e 52 break 53 obj = module 54 while parts: 55 try: 56 obj = getattr(module, parts[0]) 57 except AttributeError: 58 raise ImportError( 59 "Cannot find %s in module %r (stopped importing modules with error %s)" % (parts[0], module, last_import_error)) 60 parts = parts[1:] 61 return obj 62 63def import_module(s): 64 """ 65 Import a module. 66 """ 67 mod = __import__(s) 68 parts = s.split('.') 69 for part in parts[1:]: 70 mod = getattr(mod, part) 71 return mod 72 73def try_import_module(module_name): 74 """ 75 Imports a module, but catches import errors. Only catches errors 76 when that module doesn't exist; if that module itself has an 77 import error it will still get raised. Returns None if the module 78 doesn't exist. 79 """ 80 try: 81 return import_module(module_name) 82 except ImportError as e: 83 if not getattr(e, 'args', None): 84 raise 85 desc = e.args[0] 86 if not desc.startswith('No module named '): 87 raise 88 desc = desc[len('No module named '):] 89 # If you import foo.bar.baz, the bad import could be any 90 # of foo.bar.baz, bar.baz, or baz; we'll test them all: 91 parts = module_name.split('.') 92 for i in range(len(parts)): 93 if desc == '.'.join(parts[i:]): 94 return None 95 raise 96