Питоновские затяжки

Суть вопроса — нужно в питоновскую программу «затянуть» информацию, которую выводит в консоль другая программа или команда операционной системы.

Ну, вот встала, например, такая задача — нужно получить данные по расходу оперативной памяти. Как вариант, конечно, можно проинсталлировать пакет psutil:

$ pip3 install psutil

Но ведь не всегда бывает возможность это проделать на чужой машине в отсутствие сисадмина.

(У меня как раз возникла именно такая ситуация. На самом деле, мне нужно получить ещё больше информации о системе, а не только расход памяти. Указание опции —user в приведённой выше команде установки, для того чтобы пакет встал под пользователем, не помогает. Админ улетел за границу, и будет только через несколько дней. Ждать нельзя, нужно уже завтра-послезавтра иметь решение проблемы.)

Наверно уже нет таких пользователей, кто не знает, что в Линуксе имеется такая команда как free. Вот, как она работает:

Опция -m заставляет выводить значения в мегабайтах, а опция -t добавляет к выводу дополнительную строку Total, которая мне сейчас в общем-то и не нужна. (Но по привычке набирая команду я даже и не заметил этого.)

Мне нужно из этого вывода взять данные из второй строки, которая называется Mem. Причем взять только первые три числа из второго, третьего и четвёртого столбцов (total, used и free).

Просто нужно получить числа 3946, 2123 и 309. Ничего сложного!

Для получения вывода из команды free обратимся за помощью к пакету os. Вот код, который работает:

import os

mem = os.popen('free -m').readlines()[1].split()[1:4]

В результате в переменной mem (тип переменной — список) будет содержатся три строки. Прошу обратить внимание — не числа, а три строки символов:

['3946', '2123', '309']

Потом при необходимости эти строки можно конвертировать в числа, с помощью инструкции int() или float(), и производить с ними арифметические действия.

А сейчас я кратенько поясню, что тут происходит.

Из питоновской программы мы запускаем команду free с помощью вот такой конструкции: os.popen(‘free -m’). Далее, с помощью функции readlines() мы забираем весь вывод, который сделает команда free.

Таким образом, если мы напишем

m = os.popen('free -m').readlines()

, то m будет содержать все четыре строки. Но нам нужна только вторая строка. Её индекс равен 1, поэтому мы так и напишем — [1].

Следующий код

m1 = os.popen('free -m').readlines()[1]

загрузит в переменную m1 всю вторую строку целиком — вместе со всеми пробелами, числами и словом «Mem:».

Mem:           3946        3221         309         167        1530        1623

С целью извлечения указанных выше трёх чисел было бы разумнее сначала разбить эту строку на подстроки (точнее — на слова), и затем из полученного списка извлечь элементы с первого по третий.

Поэтому я дописываю в конец конструкции команду split() и вслед за ней указываю взятие среза [1:4].

mem = os.popen('free -m').readlines()[1].split()[1:4]

В результате мы получим список

['3946', '2123', '309']

One response to “Питоновские затяжки

  1. Послав вывод free на мелкую обработку можно произвести «пред-питоновскую обработку»
    $ free -tm | grep «Mem:» | awk ‘{ print $2 «\t» $3 «\t» $4 }’
    вывод будет типа
    3946 2123 309
    ну можно легко добавить и кв.скобки и кавычки, и запятые

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s