Robin Becker wrote: > A user points out that this code in reportlab uses the now deprecated imp > module > > def _fake_import(fn,name): > if os.path.isfile(fn): > import imp > with open(fn,'rb') as f: > imp.load_source(name,fn,f) > > and suggests I use importlib SourceFileLoader. Is there anything wrong > with this code (only for use in python 3.x) > > > def _fake_import(fn,name): > from importlib import machinery > m = machinery.SourceFileLoader(name,fn) > try: > return m.load_module(name) > except FileNotFoundError: > raise ImportError('file %s not found' % ascii(fn)) > > the newer import machinery seems particularly complex so I'm not at all > sure this does what I intend even though it seems to work.
Seems like Python is one step ahead in the deprecation race. Quoting https://docs.python.org/dev/library/importlib.html#importlib.machinery.SourceFileLoader.load_module """ load_module(name=None) Concrete implementation of importlib.abc.Loader.load_module() where specifying the name of the module to load is optional. Deprecated since version 3.6: Use importlib.abc.Loader.exec_module() instead. """ In the example section they have (for 3.4 and above) spec = importlib.util.spec_from_file_location(module_name, file_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) The importlib with all its factories is a bit intimidating; perhaps it's best to stick with imp.load_source() and wait for some simple helper functions to appear... > The original function is only used once like this > >> try: >> _fake_import(os.path.expanduser(os.path.join('~','.reportlab_mods')),'reportlab_mods') >> except (ImportError,KeyError): >> pass > > and is intended to allow per user actions in a config file when reportlab > is imported. > -- https://mail.python.org/mailman/listinfo/python-list