Установка python 2.7 в Oracle Linux 6

Дефолтным пайтоном в системе 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

Ссылки:

  1. https://stackoverflow.com/questions/20842732/libpython2-7-so-1-0-cannot-open-shared-object-file-no-such-file-or-directory
  2. https://yum.oracle.com/oracle-linux-python.html
  3. https://stackoverflow.com/questions/51646558/unable-to-install-python-packages-using-pip-in-ubuntu-linux-insecureplatformwar/54582701#54582701
  4. https://stackoverflow.com/questions/29134512/insecureplatformwarning-a-true-sslcontext-object-is-not-available-this-prevent
  5. https://access.redhat.com/documentation/en-us/red_hat_software_collections/3/html/packaging_guide/sect-enabling_the_software_collection
  6. https://iamsysadmin.net/2019/01/17/how-to-roll-back-pip/

Python скриптинг: как зайти на FTP или FTPS

Бывает нужно что-то скачать/загрузить на удалённый сервер FTP или FTPS (не путать с SFTP) в скрипте на пайтоне.

Подключаем необходимые библиотеки:

from ftplib import FTP_TLS
from ftplib import FTP

Задаём параметры подключения к FTP хосту:

host = "some_ftp.com"
port = 21
username = "username"
password = "password"

Подключаемся к обычному FTP (в примере скачиваем файл на диск):

ftp = FTP(host)
ftp.login(username, password)
try:
    handle = open('/path_to_local_file/filename', 'wb')
    ftp.retrbinary('RETR /path_to_remote_file/filename, handle.write)
    handle.close()
except:
    pass
ftp.quit()

Все команда нужно указывать по спецификации FTP протокола, например такой.

Осовные команды:
RETR – получить файл с FTP в переменную или по хендлеру записать в локальный файл;
LIST – показать список файлов/директорий в указанной или текущей по-умолчанию;
NLST – то же, что и LIST, но возвращает только имена файлов/директорий;
STOR – загрузить с презаписью файл на FTP-сервер;
и другие

Подключение к FTPS выполняется схожим образом:

try:
    handle = open('/path_to_local_file/filename', 'wb')
    ftps = FTP_TLS(host)
    ftps.login(username, password)
    ftps.prot_p()
    ftps.retrbinary('RETR /path_to_remote_file/filename', handle.write)
    ftps.quit()
    handle.close()
except:
    pass

Для работы FTP_TLS нужен пайтон 2.7+, если у вас только 2.6, то придётся сделать одно из следующего:
1. Доустановить пайтон 2.7, например как описано здесь для Oracle Linux 6:

Редактируем /etc/yum.repos.d/public-yum-ol6.repo и убеждаемся, что enabled=1 в следующем параграфе:

[ol6_software_collections]
name=Software Collection Library release 3.0 packages for Oracle Linux 6 (x86_64)
baseurl=http://yum.oracle.com/repo/OracleLinux/OL6/SoftwareCollections/x86_64/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

Далее выполняем команды от рута/судо:

yum install scl-utils
yum install python27
source /opt/rh/python27/enable
python --version

Если при запуске скрипта по cron (а скорее всего так и будет) выбивает ошибку вида:

error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

То необходимо добавить путь к библиотеке в /etc/ld.so.conf и запустить команду ldconfig, которая сама всё пропишет.

или

2. Cкачать дистрибутив пайтона 2.7 отсюда и вытащить фал ftplib.py и положить его в папку со скриптом (если скрипт запускается по cron, то это может не сработать):

wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz
tar -zxvf Python-2.7.1.tgz Python-2.7.1/Lib/ftplib.py
cp Python-2.7.1/Lib/ftplib.py /path_to_script/

или

3. Заходить на FTPS вызывая bash команды например lftp с помощью модуля subprocess.

Ссылки:

  1. https://docs.python.org/3/library/ftplib.html
  2. https://stackoverflow.com/questions/11573817/how-to-download-a-file-via-ftp-with-python-ftplib
  3. https://stackoverflow.com/questions/20842732/libpython2-7-so-1-0-cannot-open-shared-object-file-no-such-file-or-directory
  4. https://docs.cloudera.com/documentation/enterprise/6/6.0/topics/install_python_27.html