切换Vim和Syntastic的Python版本

52
8个回答

48

最简单的解决方案:

将这段代码添加到您的.vimrc文件中。

 let g:syntastic_python_python_exec = 'python3'
 let g:syntastic_python_checkers = ['python']

这是切换到Python3的简单解决方案。


3
对于我们仅在Python3中工作的人(尤其是使用Docker来包含环境时),这比设置虚拟环境来运行Vim要方便得多。 - kevlarr
对于 virtualenv 用户:如果你将其设置为“python”,它实际上会在已激活的 Python 版本上运行。 - Archeosudoerus
2
如果这个代码无法运行,那么它是如何得到24个赞的?没有名为“python3”的Python检查器。添加这一行将关闭所有Python语法检查。 - Johannes Riecken
在一些Linux发行版中,Python 3可执行文件被称为“python3”。 - Jean-François Fabre
@rubystallion 感谢您的反馈。我已经修改了答案。 - Raphael D.

20
以下内容已不再必要,如果您被迫使用严格的Python 2.x脚本,则可能会出现问题。
最佳选择是保留Syntastic默认设置,并使用conda来管理独立的Python 3和2环境(每个环境都有自己特定版本的flake8、pyflakes等安装),并在编辑每个文件时切换到适当的环境。然后,Syntastic将根据激活环境中设置的路径调用Python/flake8/其他操作。

来自Syntastic repository README

问:Python检查器抱怨语法上有效的Python 3结构...

答:配置Python检查器调用Python 3解释器而不是Python 2,例如:

let g:syntastic_python_python_exec = '/path/to/python3'

将该行添加到您的.vimrc文件中-这应该可以解决您的问题。


3
对我来说不起作用,使用syntastic de5e025ef0b8a9eec588d618ebaebd104945af4c。我从有效的Python 3构造中获得语法错误。:!python3 -m flake8 %可以正常工作。 - Marius Gedminas
5
没问题,因为g:syntastic_python_python_exec是指python检查器,与flake8检查器无关。如果你想在Python 3下运行flake8,可以安装针对Python 3编译的flake8,或编写一个包装脚本,或将g:syntastic_python_flake8_exe(而不是*_exec,请参阅手册了解区别)设置为'python3 -m flake8' - lcd047
3
我现在正在使用这些设置,它会使用系统中的 python 或者当前虚拟环境中定义的 python - 我通常会为我的 Python3 工作创建一个虚拟环境:let g:syntastic_python_checkers=['pylint'] let g:syntastic_python_python_exec = 'python' let g:syntastic_python_pylint_exe = 'python -m pylint'显然,我使用的是 pyflakes 而不是 flake8... - egeland
对我来说,这让 Syntastic 完全忽略了我交给它的任何废话。 - Błażej Michalik
2
请注意,这种方法现在已不再推荐使用。只需安装virtualenvpyenv,在其中安装相关的检查器,然后从虚拟环境中运行Vim(参见FAQ)。这样做的好处是它适用于所有Python检查器,而不仅仅是python - lcd047
显示剩余2条评论

18
尽管这里有很多答案,但我仍认为FAQ中的建议是最好的。我已将其添加到我的.vimrc文件中,以便可以轻松地在Python版本之间切换。
function Py2()
  let g:syntastic_python_python_exec = '/usr/local/bin/python2.7'
endfunction

function Py3()
  let g:syntastic_python_python_exec = '/usr/local/bin/python3.6'
endfunction

call Py3()   " default to Py3 because I try to use it when possible

安装了这些函数后,我可以轻松地在vim中使用:call Py2():call Py3()切换Python版本,具体取决于我此时需要什么。无需退出vim并激活不同的虚拟环境,就像流行的答案所要求的那样。


8

我成功地说服了Syntastic处理Python 3语法,使用

pip3 install --user flake8

为了让python3 -m flake8 *.py起作用,在vim中执行以下操作:

let g:syntastic_python_flake8_exec = 'python3'
let g:syntastic_python_flake8_args = ['-m', 'flake8']

3
除非 (1) 这不会影响到 python 检查器,且 (2) 这会使 Syntastic 认为 flake8 已安装,即使它并没有被安装。如果你坚持这种方法,请将 g:syntastic_python_flake8_exe(而不是 exec)设置为 'python3 -m flake8' - lcd047
谢谢;显然我忘记了flake8不是Syntastic中默认的Python检查器! - Marius Gedminas
你可能是想说 let g:syntastic_python_flake8_exec = 'python3'。对吗? - Tarrasch
1
哎呀,是的,谢谢!尽管今天我使用了以下命令: command! -bar Python2 let g:syntastic_python_flake8_exe = 'python2 -m flake8' | SyntasticCheckcommand! -bar Python3 let g:syntastic_python_flake8_exe = 'python3 -m flake8' | SyntasticCheck - Marius Gedminas
我正在使用pyenv,这个答案对我非常有效。谢谢! - James Robert Albert

3

如果您正在使用virtualenv,可以使用一个脚本来检测当前的Python版本并相应地调用flake8。将以下内容放置在您的路径中,并将其命名为flake8.sh

#!/bin/sh
PYMAJOR=$(python --version | awk '{print $2}'| awk -F. '{print $1}')
exec "/usr/bin/python$PYMAJOR" /usr/bin/flake8 "$@"

现在,在你的vimrc中添加以下内容:
let g:syntastic_python_flake8_exe='flake8.sh'

同样确保已经安装了 python-flake8python3-flake8(在 Ubuntu 上)。

3
不完全如此,但你可以通过安装这个包来获得与python3不兼容的警告。
假设你当前的Syntastic Python检查器是python,而你想要获得python3不兼容的警告。在命令模式下,你可以通过添加py3kwarng:syntastic_python_checkers来实现。
:let g:syntastic_python_checkers=['python', 'py3kwarn']

并且仅转换到python2.x

:let g:syntastic_python_checkers=['python']

1
但这仅适用于使用Python 2的vim。我恰好有相反的问题!但这是一个开始!谢谢 - mjb4
1
点赞因为我需要设置vim使用python27,而不是系统默认的26,而且被接受的答案没有起作用。let g:syntastic_python_checkers=['python27']起了作用。 - John C Earls

1
“我所做的修复是:只需要进行以下操作:”
  let g:syntastic_python_flake8_exec = '/path/to/python3'

为确保flake8与Python3的语法同步,即使在虚拟环境中也能正常工作。

0

仅就Zaar Hai的脚本进行迭代,下面的代码应该可以工作,并且更加健壮。

#!/usr/bin/env bash

_python=$(command -v python)

[[ "$(uname -s)" =~ Darwin ]] && IS_OSX=true

if [[ "$IS_OSX" ]]; then
    if command -v 'greadlink' >/dev/null 2>&1; then
        greadlink -f "$_python"
    else
        echo 'Install coreutils!' >&2
    fi
else
    readlink -f "$_python"
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接