Сегодня речь пойдет об известном противостоянии Python 2.x и Python 3.x, но с доселе неизведанной стороны. Недавно я начал новый домашний проектик на Python 3.4, в то время как рабочие проекты и pet project'ы я пишу на старой доброй второй ветке. Беда подкралась откуда не ждали - со стороны чекера Pylint. Как оказалось, Pylint использует для своего запуска симлинк /usr/bin/python и никаким стандартным образом нельзя указать ему другой интерпретатор. Т.е если /usr/bin/python указывает на python2.7 (как в моем случае) - все проверки будут выполняться применительно ко второй ветке, если на python3.4 - к третьей. Из всего этого следует, что штатными средствами не получится сделать одновременную поддержку обеих веток языка. После блужданий по сети удалось собрать рабочий костыль, который заставляет Pylint самому определять, к какой ветке языка относится проверяемый файл.
Все нижеописанные действия исходят из того, что до настоящего момента в системе использовался python2.7.
Устанавливаем pylint для Python3:
sudo apt-get install python3-pip
sudo pip-3.3 install pylint
Если в домашнем каталоге еще нет папки bin - создаем и добавляем к $PATH:
mkdir ~/bin
echo "export PATH=$PATH:~/bin" > ~/.bashrc
Теперь реализуем "умный" выбор ветки Python'а по первой строке проверяемого файла. В ~/bin нужно создать три файла.
~/bin/pylint
#!/bin/bash
if [[ $(head -n 1 "${@: -1}") == *python3* ]]
then
pylint3 "$@"
else
pylint2 "$@"
fi
~/bin/pylint2
#!/usr/bin/python2
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.exit(
load_entry_point('pylint==1.3.1', 'console_scripts', 'pylint')()
)
~/bin/pylint3
#!/usr/bin/python3
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.exit(
load_entry_point('pylint==1.3.1', 'console_scripts', 'pylint')()
)
Как нетрудно заметить, вся разница между ~/bin/pylint2 и ~/bin/pylint3 заключается в строках #!/usr/bin/python2
и #!/usr/bin/python3
. Еще стоит обратить внимание на то, что версия pylint захаркожена на 1.3.1. Ее следует изменить на ту, которую выводит pylint --version
.
Даем файлам права на исполнение:
chmod +x ~/bin/*
Костыль готов. Остается надеется, что у кого-нибудь будет время добавить выбор интепретатора в Pylint из коробки.
Comments
comments powered by Disqus