From 75e8a83ed1cf2f0b1b02d4b9ef55d101ba7d5ead 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 | 4 ++-- spyder/plugins/completion/languageserver/plugin.py | 10 ++++++++-- spyder/utils/programs.py | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/spyder/app/tests/test_mainwindow.py b/spyder/app/tests/test_mainwindow.py index 86245f2cc6c..3d91b21e9c2 100644 --- a/spyder/app/tests/test_mainwindow.py +++ b/spyder/app/tests/test_mainwindow.py @@ -55,7 +55,7 @@ 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.utils.programs import get_python_site_packages from spyder.widgets.dock import DockTitleBar from spyder.utils.misc import remove_backslashes @@ -2447,7 +2447,7 @@ def test_preferences_change_interpreter(qtbot, main_window): config = lsp.generate_python_config() jedi = config['configurations']['pyls']['plugins']['jedi'] assert jedi['environment'] == sys.executable - assert jedi['extra_paths'] == [] + assert jedi['extra_paths'] == get_python_site_packages(sys.executable) @pytest.mark.slow 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.