Дефолтным пайтоном в системе 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 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
Нижеприведённый код для конвертации csv -> xlsx работает на python 2.7. На 2.6 мне не удалось установить openpyxl с помощью pip install openpyxl, а на 3й версии io.open нужно заменить на просто open:
import io
from openpyxl import Workbook
# Convert to XLSX
csvfile = 'path_to_file.csv'
xlsxfile = 'path_to_file.xlsx'
workbook = Workbook(xlsxfile)
worksheet = workbook.add_worksheet()
with io.open(csvfile, 'rt', encoding='utf8') as f:
reader = csv.reader(f)
for r, row in enumerate(reader):
for c, col in enumerate(row):
worksheet.write(r, c, col)
workbook.close()
В принципе, таким способом можно приложить любой файл, в котором хранится не текстовая информация.
Ниже пример скрипта, отсылающего .xlsx файл:
import smtplib
from email.utils import formatdate
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
dst_emails = 'recipient1@example.com, recipient2@example.com'
xlsxfile = '/home/user/project1/example.xlsx'
# E-mail block
me = "sender@example.com"
# Filling e-mail info
msg = MIMEMultipart()
msg['Subject'] = "Xlsx file"
msg['From'] = me
msg['To'] = dst_emails
to = msg['To'].split()
msg['Date'] = formatdate(localtime=True)
html = """\
<html>
<head></head>
<body>
<p><br>
<strong>This is a test e-mail</strong><br>
<br>
Place body text here
Best regards,<br>
Example user<br>
</p>
</body>
</html>
"""
# Record the MIME type
letter = MIMEText(html, 'html')
# Attach letter into message container.
msg.attach(letter)
# Attach xlsx file
part = MIMEBase('application', "octet-stream")
part.set_payload(open(xlsxfile, "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"'%(xlsxfile))
msg.attach(part)
# Send the message via example.com SMTP server.
s = smtplib.SMTP('mail.example.com')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(me, to, msg.as_string())
s.quit()
Я ставил pyCharm очень давно и вот, когда пришла пора его использовать, я понял, что у меня не работают быстрые комбинации копирования и вставки Ctrl+C и Ctrl+V. Это просто катастрофа) но интернет подсказал решение:
1. Нажимаем Ctrl+Alt+S:
2. В поиске вверху слева вводит vim и отключаем плагин или меняем комбинации кнопок везде с vim на IDE, где найдёт поиск:
Т. е. мы получаем, например, вторник в среду. А в субботу, вск и Пн мы получим пятницу. Далее можно преобразовать дату в нужный нам формат и пользоваться:
Все команда нужно указывать по спецификации FTP протокола, например такой.
Осовные команды: RETR – получить файл с FTP в переменную или по хендлеру записать в локальный файл; LIST – показать список файлов/директорий в указанной или текущей по-умолчанию; NLST – то же, что и LIST, но возвращает только имена файлов/директорий; STOR – загрузить с презаписью файл на FTP-сервер; и другие
Для работы 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
Если при запуске скрипта по 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.