def _iter_relative_dirs(dirname): """ Recursively iterates subdirectories of all levels from dirname :param dirname: Directory name :return: Iterator that yields files and directory from the given dir and all it's (recursive) subdirectories """ if not dirname: dirname = os.curdir try: files_or_dirs = list_dir_contents(dirname) except os.error: return for file_or_dir in files_or_dirs: yield file_or_dir path = os.path.join(dirname, file_or_dir) for sub_file_or_dir in _iter_relative_dirs(path): yield os.path.join(file_or_dir, sub_file_or_dir)
def _import_module(file_path): if not os.path.exists(file_path): raise ImportError module_name = os.path.splitext(os.path.basename(file_path))[0] module_dir = os.path.dirname(file_path) if module_dir not in sys.path: sys.path.insert(0, module_dir) # Ugly inconsistency: Python will insist on correctly cased module names # independent of whether the OS is case-sensitive or not. # We want all cases to match though. if platform.system() == 'Windows': # pragma: nocover for cased_file_path in list_dir_contents(module_dir): cased_module_name = os.path.splitext(cased_file_path)[0] if cased_module_name.lower() == module_name.lower(): module_name = cased_module_name break return __import__(module_name)
def relative_wildcard_glob(dirname, pattern): """ Non-recursive glob for one directory. Accepts wildcards. :param dirname: Directory name :param pattern: Glob pattern with wildcards :return: List of files in the dir of dirname that match the pattern """ if not dirname: dirname = os.curdir try: if '**' in pattern: names = list(_iter_relative_dirs(dirname)) else: names = list_dir_contents(dirname) except OSError: return [] result = [] pattern = os.path.normcase(pattern) match = re.compile(translate(pattern)).match for name in names: if match(os.path.normcase(name)): result.append(name) return result