diff --git a/spyder/plugins/completion/languageserver/plugin.py b/spyder/plugins/completion/languageserver/plugin.py index 65753717409..37f5ed7b7c2 100644 --- a/spyder/plugins/completion/languageserver/plugin.py +++ b/spyder/plugins/completion/languageserver/plugin.py @@ -26,6 +26,7 @@ from spyder.config.manager import CONF from spyder.api.completion import SpyderCompletionPlugin from spyder.utils.misc import check_connection_port, getcwd_or_home +from spyder.utils.programs import get_python_site_packages from spyder.plugins.completion.languageserver import LSP_LANGUAGES from spyder.plugins.completion.languageserver.client import LSPClient from spyder.plugins.completion.languageserver.confpage import ( @@ -574,15 +575,20 @@ def generate_python_config(self): } # Jedi configuration + extra_paths = self.get_option('spyder_pythonpath', section='main', + default=[]) if self.get_option('default', section='main_interpreter'): environment = None else: environment = self.get_option('custom_interpreter', section='main_interpreter') + # jedi can miss the site-package: see + # https://github.com/davidhalter/jedi/issues/1540 + extra_paths += get_python_site_packages(environment) + jedi = { 'environment': environment, - 'extra_paths': self.get_option('spyder_pythonpath', - section='main', default=[]), + 'extra_paths': extra_paths, } jedi_completion = { 'enabled': self.get_option('code_completion'), diff --git a/spyder/utils/programs.py b/spyder/utils/programs.py index 5f8509131df..65e0c471782 100644 --- a/spyder/utils/programs.py +++ b/spyder/utils/programs.py @@ -24,6 +24,7 @@ import tempfile import threading import time +import ast # Third party imports import psutil @@ -967,6 +968,19 @@ def check_python_help(filename): return False +def get_python_site_packages(pyexec): + """Get the site-packages for a given python executable""" + script = 'import site; print(site.getsitepackages())' + try: + proc = run_program('env', ['-i', pyexec, '-c', script]) + stdout, stderr = proc.communicate() + pkgs = ast.literal_eval(stdout.decode()) + except Exception: + pkgs = [] + + return pkgs + + def is_spyder_process(pid): """ Test whether given PID belongs to a Spyder process.