DateTagsPython

Сегодня речь пойдет об известном противостоянии 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