125 lines
3.5 KiB
Python
125 lines
3.5 KiB
Python
"""Utility functions for finding modules
|
|
|
|
Utility functions for finding modules on sys.path.
|
|
|
|
`find_mod` finds named module on sys.path.
|
|
|
|
`get_init` helper function that finds __init__ file in a directory.
|
|
|
|
`find_module` variant of imp.find_module in std_lib that only returns
|
|
path to module and not an open file object as well.
|
|
|
|
|
|
|
|
"""
|
|
#-----------------------------------------------------------------------------
|
|
# Copyright (c) 2011, the yap_ipython Development Team.
|
|
#
|
|
# Distributed under the terms of the Modified BSD License.
|
|
#
|
|
# The full license is in the file COPYING.txt, distributed with this software.
|
|
#-----------------------------------------------------------------------------
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# Imports
|
|
#-----------------------------------------------------------------------------
|
|
|
|
# Stdlib imports
|
|
import imp
|
|
import os
|
|
|
|
# Third-party imports
|
|
|
|
# Our own imports
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# Globals and constants
|
|
#-----------------------------------------------------------------------------
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# Local utilities
|
|
#-----------------------------------------------------------------------------
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# Classes and functions
|
|
#-----------------------------------------------------------------------------
|
|
def find_module(name, path=None):
|
|
"""imp.find_module variant that only return path of module.
|
|
|
|
The `imp.find_module` returns a filehandle that we are not interested in.
|
|
Also we ignore any bytecode files that `imp.find_module` finds.
|
|
|
|
Parameters
|
|
----------
|
|
name : str
|
|
name of module to locate
|
|
path : list of str
|
|
list of paths to search for `name`. If path=None then search sys.path
|
|
|
|
Returns
|
|
-------
|
|
filename : str
|
|
Return full path of module or None if module is missing or does not have
|
|
.py or .pyw extension
|
|
"""
|
|
if name is None:
|
|
return None
|
|
try:
|
|
file, filename, _ = imp.find_module(name, path)
|
|
except ImportError:
|
|
return None
|
|
if file is None:
|
|
return filename
|
|
else:
|
|
file.close()
|
|
if os.path.splitext(filename)[1] in [".py", ".pyc"]:
|
|
return filename
|
|
else:
|
|
return None
|
|
|
|
def get_init(dirname):
|
|
"""Get __init__ file path for module directory
|
|
|
|
Parameters
|
|
----------
|
|
dirname : str
|
|
Find the __init__ file in directory `dirname`
|
|
|
|
Returns
|
|
-------
|
|
init_path : str
|
|
Path to __init__ file
|
|
"""
|
|
fbase = os.path.join(dirname, "__init__")
|
|
for ext in [".py", ".pyw"]:
|
|
fname = fbase + ext
|
|
if os.path.isfile(fname):
|
|
return fname
|
|
|
|
|
|
def find_mod(module_name):
|
|
"""Find module `module_name` on sys.path
|
|
|
|
Return the path to module `module_name`. If `module_name` refers to
|
|
a module directory then return path to __init__ file. Return full
|
|
path of module or None if module is missing or does not have .py or .pyw
|
|
extension. We are not interested in running bytecode.
|
|
|
|
Parameters
|
|
----------
|
|
module_name : str
|
|
|
|
Returns
|
|
-------
|
|
modulepath : str
|
|
Path to module `module_name`.
|
|
"""
|
|
parts = module_name.split(".")
|
|
basepath = find_module(parts[0])
|
|
for submodname in parts[1:]:
|
|
basepath = find_module(submodname, [basepath])
|
|
if basepath and os.path.isdir(basepath):
|
|
basepath = get_init(basepath)
|
|
return basepath
|