CentOS: обновление Python до 2.7 и установка Django 1.8

Автор: | 07/05/2015

centos-logo-new-4По умолчанию – CentOS 6 использует Python 2.6, и Django 1.3.

Задача – установить Python 2.7, Setuptools, PIP и Django 1.8.

Ещё одно замечание, прежде чем вы начнёте – с вероятностью в 99% – проекты на Django 1.3 не “взлетят” на Django 1.8.

Основная проблема при обновлении (которая почему-то почти нигде не указывается) – это то, что YUM зависит от от версии Python:

# repoquery --requires yum
...
python(abi) = 2.6

Ниже будет показано – как именно это проявляется.

Установка выполняется на:

# cat /etc/redhat-release
CentOS release 6.6 (Final)

Обновляем все установленные пакеты:

# yum update

Кроме того – для установки Setuptools потребуется модуль zlib-devel:

# yum install zlib-devel

Так как без него – будет ошибка при вызове zlib():

...
  File "/usr/local/lib/python2.7/zipfile.py", line 526, in __init__
    self._decompressor = zlib.decompressobj(-15)
AttributeError: 'NoneType' object has no attribute 'decompressobj'

А для установки PIP – модуль openssl-devel:

# yum install openssl-devel

Без которого будет возникать такая ошибка:

...
  File "/tmp/tmpSUScFN/pip.zip/pip/_vendor/__init__.py", line 92, in load_module
ImportError: No module named 'pip._vendor.requests'

Установка Python 2.7

Важно: проверьте $PATH:

# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/setevoy/scripts/:/home/setevoy/scripts/money/:/home/setevoy/aws/cli_tools/ec2-api-tools-1.7.2.3/bin:/root/bin:/home/setevoy/scripts/:/home/setevoy/scripts/money/:/home/setevoy/aws/cli_tools/ec2-api-tools-1.7.2.3/bin

Важно, что бы /usr/local/bin был до /usr/bin – т.к. Python 2.6 установлен в /usr/bin, а Python 2.7 – будет устанавливаться в /usr/local/bin (дальше – покажу как это определяется).

Проверяем наличие компилятора:

# gcc -v
...
gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)

Если его нет – устанавливаем:

# yum install gcc

С сайта Python загружаем последнюю доступную версию:

# cd /tmp/
# wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz

Распаковываем, меняем директорию:

# tar xfp Python-2.7.9.tgz
# cd Python-2.7.9

Проверяем зависимости и создаём Makefile:

# ./configure

Теперь, возвращаясь к вопросу о $PATH: если посмотреть созданный Makefile – то видно, что prefix по умолчанию указан /usr/local:

# cat Makefile | grep prefix
...
prefix=         /usr/local
...

Что и требуется. Изменить его можно опцией --prefix:

# ./configure -h | grep prefix
  --prefix=PREFIX         install architecture-independent files in PREFIX

Собираем пакет:

# make

И устанавливаем:

# make install

Проверяем:

# python --version
Python 2.7.9

Проверяем – какой именно Python используется:

# which python
/usr/local/bin/python

Тогда как старый – остался в системе:

# /usr/bin/python --version
Python 2.6.6

YUM работает:

# yum history
Loaded plugins: fastestmirror, security
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
     7 | root <root>              | 2015-05-06 17:03 | I, U           |   28  <
     6 | root <root>              | 2015-04-05 17:32 | Install        |    2 >E
     5 | root <root>              | 2015-04-05 17:31 | Install        |    1  <
     4 | root <root>              | 2015-04-05 17:22 | Install        |    6 >
     3 | root <root>              | 2015-04-05 17:21 | Install        |    1
     2 | root <root>              | 2015-04-05 17:02 | I, U           |  138
     1 | System <unset>           | 2015-04-05 16:36 | Install        |  629
history list

И действительно – с Python 2.7 YUM работать не может:

# /usr/local/bin/python /usr/bin/yum -h
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.9 (default, May  6 2015, 17:31:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]
...

Тогда как с Python 2.6 – всё работает по-прежнему:

# /usr/bin/python /usr/bin/yum -h | head -n 4
Loaded plugins: fastestmirror, security
Usage: yum [options] COMMAND

List of Commands:

Не знаю – как именно YUM определяет путь к Python – но факт, он продолжает использовать /usr/bin.

Если каких-то модулей не хватает (как openssl-devel в начале статьи) – достаточно просто пересобрать и установить Python поверх:

# make clean
# ./configure
# make
# make install

С этим разобрались – переходим к Setuptools и PIP.

Установка Setuptools

# wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
# python ez_setup.py
...
Installed /usr/local/lib/python2.7/site-packages/setuptools-15.2-py2.7.egg
Processing dependencies for setuptools==15.2
Finished processing dependencies for setuptools==15.2

Установка PIP

# wget https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py
# python get-pip.py
...
Successfully installed pip-6.1.1

Переходим к Django 1.8.

Установка Django 1.8

В репозиториях CentOS имеется Django 1.3:

...
python-django                                        noarch                                        1.3.1-1.el6.rf
...

Поэтому – скачаем исходники, и установим вручную.

На странице проекта Django находим ссылку и качаем архив:

# wget https://www.djangoproject.com/m/releases/1.8/Django-1.8.1.tar.gz

Распаковываем, меняем директорию:

# tar xfp Django-1.8.1.tar.gz
# cd Django-1.8.1

И дальше-  как обычно:

# python setup.py install

Проверяем:

# python -c "import django; print(django.get_version())"
1.8.1

Готово.