docstr: Finds individually-specified Python modules, ie. those listed by
  module name in 'self.py_modules'.  Returns a list of tuples (package,
  module_base, filename): 'package' is a tuple of the path through
  package-space to the module; 'module_base' is the bare (no
  packages, no dots) module name, and 'filename' is the path to the
  ".py" file (relative to the distribution root) that implements the
  module.
docstr_tok: ["Finds","individually-specified","Python","modules",",","ie",".","those","listed","by","module","name","in","'self.py_modules","'",".","Returns","a","list","of","tuples","(","package",",","module_base",",","filename",")",":","'package","'","is","a","tuple","of","the","path","through","package-space","to","the","module",";","'module_base","'","is","the","bare","(","no","packages",",","no","dots",")","module","name",",","and","'filename","'","is","the","path","to","the","''",".py","''","file","(","relative","to","the","distribution","root",")","that","implements","the","module","."]
code: def find_modules(self):
      """Finds individually-specified Python modules, ie. those listed by
      module name in 'self.py_modules'.  Returns a list of tuples (package,
      module_base, filename): 'package' is a tuple of the path through
      package-space to the module; 'module_base' is the bare (no
      packages, no dots) module name, and 'filename' is the path to the
      ".py" file (relative to the distribution root) that implements the
      module.
      """
      # Map package names to tuples of useful info about the package:
      #    (package_dir, checked)
      # package_dir - the directory where we'll find source files for
      #   this package
      # checked - true if we have checked that the package directory
      #   is valid (exists, contains __init__.py, ... ?)
      packages = {}
  
      # List of (package, module, filename) tuples to return
      modules = []
  
      # We treat modules-in-packages almost the same as toplevel modules,
      # just the "package" for a toplevel is empty (either an empty
      # string or empty list, depending on context).  Differences:
      #   - don't check for __init__.py in directory for empty package
      for module in self.py_modules:
          path = module.split(".")
          package = ".".join(path[0:-1])
          module_base = path[-1]
  
          try:
              (package_dir, checked) = packages[package]
          except KeyError:
              package_dir = self.get_package_dir(package)
              checked = 0
  
          if not checked:
              init_py = self.check_package(package, package_dir)
              packages[package] = (package_dir, 1)
              if init_py:
                  modules.append((package, "__init__", init_py))
  
          # XXX perhaps we should also check for just .pyc files
          # (so greedy closed-source bastards can distribute Python
          # modules too)
          module_file = os.path.join(package_dir, module_base + ".py")
          if not self.check_module(module, module_file):
              continue
  
          modules.append((package, module_base, module_file))
  
      return modules
  
imports: import os
  import importlib.util
  import sys
  import glob
  from ..core import Command
  from ..errors import DistutilsOptionError, DistutilsFileError
  from ..util import convert_path
  from distutils._log import log
label_desc: Use image node_id 11 for calling the build_py obj's underlying member method code with example usage: obj.find_modules() and returns: modules