Implement new strategy to find Python path

This commit is contained in:
micbou 2016-01-11 13:33:43 +01:00
parent 135923a40a
commit c7e32b3600

View File

@ -18,14 +18,14 @@
# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>.
import os
import sys
import vim
import functools
from ycmd import utils
DIR_OF_CURRENT_SCRIPT = os.path.dirname( os.path.abspath( __file__ ) )
WIN_PYTHON27_PATH = 'C:\python27\python.exe'
WIN_PYTHON26_PATH = 'C:\python26\python.exe'
WIN_PYTHON_PATH = os.path.join( sys.exec_prefix, 'python.exe' )
def Memoize( obj ):
@ -42,29 +42,39 @@ def Memoize( obj ):
@Memoize
def PathToPythonInterpreter():
user_path_to_python = vim.eval( 'g:ycm_path_to_python_interpreter' )
python_interpreter = vim.eval( 'g:ycm_path_to_python_interpreter' )
if user_path_to_python:
return user_path_to_python
if python_interpreter:
if not CheckPythonVersion( python_interpreter ):
raise RuntimeError( "Path in 'g:ycm_path_to_python_interpreter' option "
"does not point to a valid Python 2.6 or 2.7." )
# We check for 'python2' before 'python' because some OS's (I'm looking at
# you Arch Linux) have made the... interesting decision to point
# /usr/bin/python to python3.
python_names = [ 'python2', 'python' ]
return python_interpreter
path_to_python = utils.PathToFirstExistingExecutable( python_names )
if path_to_python:
return path_to_python
# On UNIX platforms, we use sys.executable as the Python interpreter path.
# We cannot use sys.executable on Windows because for unknown reasons, it
# returns the Vim executable. Instead, we use sys.exec_prefix to deduce the
# interpreter path.
python_interpreter = ( WIN_PYTHON_PATH if utils.OnWindows() else
sys.executable )
# On Windows, Python may not be on the PATH at all, so we check some common
# install locations.
if utils.OnWindows():
if os.path.exists( WIN_PYTHON27_PATH ):
return WIN_PYTHON27_PATH
elif os.path.exists( WIN_PYTHON26_PATH ):
return WIN_PYTHON26_PATH
if not CheckPythonVersion( python_interpreter ):
raise RuntimeError( "Cannot find Python 2.6 or 2.7. You can set its path "
"using the 'g:ycm_path_to_python_interpreter' "
"option." )
raise RuntimeError( 'Python 2.7/2.6 not installed!' )
return python_interpreter
def CheckPythonVersion( python_interpreter ):
"""Check if given path is the Python interpreter version 2.6 or 2.7."""
command = [ python_interpreter,
'-c',
"import sys;"
"major, minor = sys.version_info[ :2 ];"
"sys.exit( major != 2 or minor < 6)" ]
return utils.SafePopen( command ).wait() == 0
def PathToServerScript():