Дефолтным пайтоном в системе Oracle Linux 6 является версия 2.6. Проблема в том, что эта версия пайтона уже очень устарела и не поддерживается многими библиотеками и даже pip (который надо устанавливать из репозитория Epel) не хочет работать без сильного колдунства – выдаёт ошибку “ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail.”
Потому, если требуется использование модулей, устанавливаемых с помощью pip, то нужно установить более новый пайтон.
Его можно установить из репозитория Software Collection Library для Oracle Linux 6.10. Похожая процедура и для других RHEL 6 систем вроде CentOS 6, но там названия репозиториев и пути могут отличаться.
Выполняем команду:
yum repolist all
И ищем искомый репозиторий (по-умолчанию он выключен – disabled):
Чтобы его включить, выполняем команду:
yum-config-manager --enable public_ol6_software_collections
После чего устанавливаем нужный пайтон и утилиту для управления софтверными коллекциями:
yum install python27 scl-utils
Как зависимости сразу должны подтянуться pip и прочие необходимые пакеты.
Теперь включим пайтон 2.7 для текущей сессии:
scl enable python27 bash
Эта команда запускает новый баш, где по-умолчанию используется 2.7 пайтон вместо 2.6. И можно выполнять скрипты или команды в интерпретаторе. К сожалению, сделать 2.7й системным проблематично.
Чтобы скрипты, запущенные по cron, работали с 2.7 необходимо сделать нижеизложенное.
В задаче крона нужно прописывать путь к интерпретатору 2.7, а не просто к пайтону:
updatedb
locate python2.7
В моём случае это было /opt/rh/python27/root/usr/bin/python
Далее необходимо обновить путь загрузки библиотек, иначе пайтон 2.7, запускаясь по крону, будет выдавать ошибку “ImportError: libpython2.7.so.1.0: cannot open shared object file: No such file or directory”:
locate libpython2.7.so.1.0
В моём случае папка с библотеками пайтона: /opt/rh/python27/root/usr/lib64
Затем добавить этот путь строчкой в этот файл:
nano /etc/ld.so.conf
И выполнить команду:
ldconfig
Всё, теперь скрипты, запущенные по крон, будут работать с пайтоном 2.7. Ну и конечно же в скрипте необходимо указывать абсолютные пути к файлам или командам (например, если вызываете по subprocess).
Также не советую обновлять pip, если он попросит. Иначе вполне вероятно придётся откатывать pip примерно как описано в [6].
Пример задачи, которая выполняется раз в месяц и логирует вывод консоли вместе с ошибками, если таковые будут, в файл job.log:
0 7 1 * * su user -c "/opt/rh/python27/root/usr/bin/python /home/user/project/script.py" > /home/user/project/job.log 2>&1
Ссылки:
- https://stackoverflow.com/questions/20842732/libpython2-7-so-1-0-cannot-open-shared-object-file-no-such-file-or-directory
- https://yum.oracle.com/oracle-linux-python.html
- https://stackoverflow.com/questions/51646558/unable-to-install-python-packages-using-pip-in-ubuntu-linux-insecureplatformwar/54582701#54582701
- https://stackoverflow.com/questions/29134512/insecureplatformwarning-a-true-sslcontext-object-is-not-available-this-prevent
- https://access.redhat.com/documentation/en-us/red_hat_software_collections/3/html/packaging_guide/sect-enabling_the_software_collection
- https://iamsysadmin.net/2019/01/17/how-to-roll-back-pip/