From 5f77b0e4a8f1147f5853282590fd70afa1f3d9a1 Mon Sep 17 00:00:00 2001 From: Ryan Clary Date: Fri, 10 Apr 2020 15:37:17 -0700 Subject: [PATCH] * add site-packages to jedi configuration; see https://github.com/davidhalter/jedi/issues/1540 --- spyder/app/tests/test_mainwindow.py | 1 - .../completion/languageserver/plugin.py | 13 +++++++++++-- spyder/utils/programs.py | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/spyder/app/tests/test_mainwindow.py b/spyder/app/tests/test_mainwindow.py index 9503970f6b2..2a027114188 100644 --- a/spyder/app/tests/test_mainwindow.py +++ b/spyder/app/tests/test_mainwindow.py @@ -55,7 +55,6 @@ from spyder.plugins.help.tests.test_plugin import check_text from spyder.plugins.ipythonconsole.utils.kernelspec import SpyderKernelSpec from spyder.py3compat import PY2, to_text_string -from spyder.utils.programs import is_module_installed from spyder.widgets.dock import DockTitleBar from spyder.utils.misc import remove_backslashes diff --git a/spyder/plugins/completion/languageserver/plugin.py b/spyder/plugins/completion/languageserver/plugin.py index 65753717409..33e0fc66c1b 100644 --- a/spyder/plugins/completion/languageserver/plugin.py +++ b/spyder/plugins/completion/languageserver/plugin.py @@ -26,6 +26,8 @@ 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.utils.conda import is_conda_env 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 +576,22 @@ 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 + if (not is_conda_env(pyexec=sys.executable) + and is_conda_env(pyexec=environment)): + 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..294f4d946cf 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,23 @@ 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: + if os.name != 'nt': + # clean environment is more reliable + proc = run_program('env', ['-i', pyexec, '-c', script]) + else: + proc = run_program(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.