1"""Utility functions for finding modules
2
3Utility functions for finding modules on sys.path.
4
5"""
6#-----------------------------------------------------------------------------
7# Copyright (c) 2011, the IPython Development Team.
8#
9# Distributed under the terms of the Modified BSD License.
10#
11# The full license is in the file COPYING.txt, distributed with this software.
12#-----------------------------------------------------------------------------
13
14#-----------------------------------------------------------------------------
15# Imports
16#-----------------------------------------------------------------------------
17
18# Stdlib imports
19import importlib
20import sys
21
22# Third-party imports
23
24# Our own imports
25
26
27#-----------------------------------------------------------------------------
28# Globals and constants
29#-----------------------------------------------------------------------------
30
31#-----------------------------------------------------------------------------
32# Local utilities
33#-----------------------------------------------------------------------------
34
35#-----------------------------------------------------------------------------
36# Classes and functions
37#-----------------------------------------------------------------------------
38
39def find_mod(module_name):
40 """
41 Find module `module_name` on sys.path, and return the path to module `module_name`.
42
43 * If `module_name` refers to a module directory, then return path to `__init__` file.
44 * If `module_name` is a directory without an __init__file, return None.
45
46 * If module is missing or does not have a `.py` or `.pyw` extension, return None.
47 * Note that we are not interested in running bytecode.
48
49 * Otherwise, return the fill path of the module.
50
51 Parameters
52 ----------
53 module_name : str
54
55 Returns
56 -------
57 module_path : str
58 Path to module `module_name`, its __init__.py, or None,
59 depending on above conditions.
60 """
61 spec = importlib.util.find_spec(module_name)
62 module_path = spec.origin
63 if module_path is None:
64 if spec.loader in sys.meta_path:
65 return spec.loader
66 return None
67 else:
68 split_path = module_path.split(".")
69 if split_path[-1] in ["py", "pyw"]:
70 return module_path
71 else:
72 return None