Python语法检查程序(Pylint,Prospector ...)与KeyError崩溃:'repoze.who'从Vim内部运行时

时间:2014-11-07 11:51:37

标签: python vim pylint syntastic repoze.who

我遇到了从vim内部运行pylint的问题(如果使用syntastic插件,则需要执行此操作)。

例如:!pylint --version与此追溯崩溃:

Traceback (most recent call last):                                                                                                                                                  
  File "/home/seanh/.virtualenvs/ckan/bin/pylint", line 5, in <module>                                                                                                              
    from pkg_resources import load_entry_point                                                                                                                                      
  File "/home/seanh/.virtualenvs/ckan/lib/python2.7/site-packages/pkg_resources.py", line 2736, in <module>                                                                         
    add_activation_listener(lambda dist: dist.activate())                                                                                                                           
  File "/home/seanh/.virtualenvs/ckan/lib/python2.7/site-packages/pkg_resources.py", line 698, in subscribe                                                                         
    callback(dist)                                                                                                                                                                  
  File "/home/seanh/.virtualenvs/ckan/lib/python2.7/site-packages/pkg_resources.py", line 2736, in <lambda>                                                                         
    add_activation_listener(lambda dist: dist.activate())                                                                                                                           
  File "/home/seanh/.virtualenvs/ckan/lib/python2.7/site-packages/pkg_resources.py", line 2274, in activate                                                                         
    list(map(declare_namespace, self._get_metadata('namespace_packages.txt')))                                                                                                      
  File "/home/seanh/.virtualenvs/ckan/lib/python2.7/site-packages/pkg_resources.py", line 1870, in declare_namespace                                                                
    path = sys.modules[parent].__path__                                                                                                                                             
KeyError: 'repoze.who'

我也看到在Vim内运行的同一个错误prospector

但我无法从Vim外部重现错误。在一个壳。如果我在shell中激活我的Python虚拟环境,那么运行pylint --version我得到:

$ pylint --version
Warning: option include-ids is deprecated and ignored.
Warning: option symbols is deprecated and ignored.
pylint 1.3.1, 
astroid 1.2.1, common 0.62.1
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2]

如果我然后在同一个shell中运行vim并在Vim中执行:!pylint --version,我将获得上面的回溯。退出Vim并再次在shell中运行pylint --version,这很好。

vim运行命令的环境和我的shell环境之间必定存在不同的东西,即触发崩溃。但我不知道如何调查这一点,因此这个问题与vim标签。

此处还涉及

repoze.who。如果我破坏了我的virtualenv并创建了一个新的virtualenv,除了pylint和其他语法检查器之外什么都没有,那么在vim的内部和外部都可以正常工作。但是,如果我在virtualenv中pip install repoze.who==1.0.19然后在vim中运行:!pylint --version时重新出现上面的pylint崩溃(但是在我的shell中运行它时没有)。

从Ubuntu 14.04上的软件包安装Vim版本7.4。

1 个答案:

答案 0 :(得分:0)

这似乎是repoze.who 1.0.19的一个问题。 virtualenv中的pip install -U repoze.who==2.2摆脱了这个问题。很奇怪,你可以做pip install -U repoze.who==1.0.19并降级它,但是pylint崩溃仍然没有了。我从来没有深究究竟是什么导致它,但我怀疑它可能与repoze.who 2.0a1更改日志中的这个项目有关:删除ez_setup.py并在setup.py中依赖它(支持分发)