# Copyright (c) 2009- Spyder Kernels Contributors # # Licensed under the terms of the MIT License # (see spyder_kernels/__init__.py for details) """Utility functions.""" import os import re import sysconfig def create_pathlist(): """ Create list of Python library paths to be skipped from module reloading and Pdb steps. """ # Get standard installation paths try: paths = sysconfig.get_paths() standard_paths = [paths['stdlib'], paths['purelib'], paths['scripts'], paths['data']] except Exception: standard_paths = [] # Get user installation path # See spyder-ide/spyder#8776 try: import site if getattr(site, 'getusersitepackages', False): # Virtualenvs don't have this function but # conda envs do user_path = [site.getusersitepackages()] elif getattr(site, 'USER_SITE', False): # However, it seems virtualenvs have this # constant user_path = [site.USER_SITE] else: user_path = [] except Exception: user_path = [] return standard_paths + user_path def path_is_library(path, initial_pathlist=None): """Decide if a path is in user code or a library according to its path.""" # Compute DEFAULT_PATHLIST only once and make it global to reuse it # in any future call of this function. if 'DEFAULT_PATHLIST' not in globals(): global DEFAULT_PATHLIST DEFAULT_PATHLIST = create_pathlist() if initial_pathlist is None: initial_pathlist = [] pathlist = initial_pathlist + DEFAULT_PATHLIST if path is None: # Path probably comes from a C module that is statically linked # into the interpreter. There is no way to know its path, so we # choose to ignore it. return True elif any([p in path for p in pathlist]): # We don't want to consider paths that belong to the standard # library or installed to site-packages. return True elif os.name == 'nt': if re.search(r'.*\\pkgs\\.*', path): return True else: return False elif not os.name == 'nt': # Paths containing the strings below can be part of the default # Linux installation, Homebrew or the user site-packages in a # virtualenv. patterns = [ r'^/usr/lib.*', r'^/usr/local/lib.*', r'^/usr/.*/dist-packages/.*', r'^/home/.*/.local/lib.*', r'^/Library/.*', r'^/Users/.*/Library/.*', r'^/Users/.*/.local/.*', ] if [p for p in patterns if re.search(p, path)]: return True else: return False else: return False