Проверка синтаксиса Python (Pylint, Prospector...), сбой с KeyError: 'repoze.who' при запуске из Vim

У меня проблема с запуском pylint изнутри vim (что нужно сделать, если вы используете синтетический плагин).

Например :!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.

Но я не могу воспроизвести ошибку извне Vim. В оболочке. Если я активирую свою виртуальную среду 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]

Если я тогда бегу vim в той же оболочке и делай :!pylint --version в Vim я получаю трассировку выше. Выйди из Vim и беги pylint --version снова в оболочку и все нормально.

Должно быть что-то другое между средой, в которой vim запускает команду, и средой моей оболочки, которая вызывает сбой. Но я не знаю, как это исследовать, поэтому вопрос с тегом vim.

repoze.who также замешан здесь. Если я уничтожу свой virtualenv и создам новый virtualenv, в котором не будет ничего, кроме pylint и других средств проверки синтаксиса, то все будет работать как внутри, так и вне vim. Но если я тогда pip install repoze.who==1.0.19 в virtualenv, то сбой Pylint выше вновь появляется при запуске :!pylint --version в VIM (но не при запуске его в моей оболочке).

Vim версии 7.4 устанавливается из пакета на Ubuntu 14.04.

1 ответ

Решение

Кажется, это проблема с repoze.who 1.0.19. pip install -U repoze.who==2.2 в virtualenv избавляется от проблемы. Странно можно тогда сделать pip install -U repoze.who==1.0.19 и понизить его, и авария в Пилинте все еще исчезла. Я никогда не понимал, что именно это вызывает, но я подозреваю, что это может быть связано с этим элементом из журнала изменений repoze.who 2.0a1: удалите ez_setup.py и зависимость от него в setup.py (поддержка распространяет),

Другие вопросы по тегам