Make it possible to connect to a subprocess to get the sys path

This commit is contained in:
Dave Halter
2017-11-14 18:25:37 +01:00
parent 46b81dfa6d
commit 96149d2e6a
7 changed files with 51 additions and 52 deletions

View File

@@ -24,6 +24,7 @@ from jedi.api import classes
from jedi.api import interpreter
from jedi.api import helpers
from jedi.api.completion import Completion
from jedi.api.virtualenv import DefaultEnvironment
from jedi.evaluate import Evaluator
from jedi.evaluate import imports
from jedi.evaluate import usages
@@ -117,22 +118,15 @@ class Script(object):
project = Project(sys_path=sys_path)
if isinstance(self, Interpreter):
# It's not possible to use a subprocess for the interpreter.
self._compiled_subprocess = None
compiled_subprocess = None
else:
if environment is None:
executable = sys.executable
else:
executable = environment.executable
self._compiled_subprocess = get_subprocess(executable)
self._evaluator = Evaluator(self._grammar, project, self._compiled_subprocess)
environment = DefaultEnvironment()
compiled_subprocess = environment.get_subprocess()
self._evaluator = Evaluator(self._grammar, project, compiled_subprocess)
project.add_script_path(self.path)
debug.speed('init')
def __del__(self):
if self._compiled_subprocess is not None:
self._compiled_subprocess.delete_evaluator(evaluator)
self._evaluator.cleanup_evaluator
@cache.memoize_method
def _get_module_node(self):
return self._grammar.parse(

View File

@@ -1,5 +1,6 @@
import os
import re
import sys
import sysconfig
from subprocess import CalledProcessError
from collections import namedtuple
@@ -7,7 +8,7 @@ from collections import namedtuple
from jedi._compatibility import check_output
from jedi.evaluate.project import Project
from jedi.cache import memoize_method
from jedi.evaluate.compiled.subprocess import get_subprocess
_VersionInfo = namedtuple('VersionInfo', 'major minor micro')
@@ -28,6 +29,10 @@ class Environment(object):
def get_project(self):
return Project(self.get_sys_path())
def get_subprocess(self):
return get_subprocess(self._executable)
@memoize_method
def get_sys_path(self):
vars = {
'base': self._path
@@ -38,35 +43,15 @@ class Environment(object):
# on how the Python version was compiled (ENV variables).
# If you omit -S when starting Python (normal case), additionally
# site.py gets executed.
write
# venv
['', '/usr/lib/python3.3', '/usr/lib/python3.3/plat-x86_64-linux-gnu',
'/usr/lib/python3.3/lib-dynload',
'/home/dave/source/python/virtenv/venv3.3/lib/python3.3/site-packages']
['/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu',
'/usr/lib/python3.4/lib-dynload',
'/home/dave/source/stuff_cloudscale/rgw-metrics/venv/lib/python3.4/site-packages']
['', '/usr/lib/python35.zip', '/usr/lib/python3.5',
'/usr/lib/python3.5/plat-x86_64-linux-gnu',
'/usr/lib/python3.5/lib-dynload',
'/home/dave/source/python/virtenv/venv3.5/lib/python3.5/site-packages']
return self.get_subprocess().get_sys_path()
{'purelib': '{base}/local/lib/python{py_version_short}/dist-packages',
'stdlib': '{base}/lib/python{py_version_short}',
'scripts': '{base}/local/bin',
'platinclude': '{platbase}/local/include/python{py_version_short}',
'include': '{base}/local/include/python{py_version_short}',
'data': '{base}/local',
'platstdlib': '{platbase}/lib/python{py_version_short}',
'platlib': '{platbase}/local/lib/python{py_version_short}/dist-packages'}
return [] + additional_paths
def _get_long_running_process(self):
return process
class DefaultEnvironment(Environment):
def __init__(self, script_path):
# TODO make this usable
path = script_path
super(DefaultEnvironment, self).__init__(path, sys.executable)
def find_virtualenvs(paths=None):
@@ -95,11 +80,11 @@ def _get_executable_path(path):
def _get_version(executable):
try:
output = check_output(executable, '--version')
output = check_output([executable, '--version'])
except (CalledProcessError, OSError):
raise NoVirtualEnv()
match = re.match(r'Python (\d+)\.(\d+)\.(\d+)', output)
match = re.match(rb'Python (\d+)\.(\d+)\.(\d+)', output)
if match is None:
raise NoVirtualEnv()