Pull to refresh

Скрипты Python против Bash

Reading time 4 min
Views 119K
Не секрет, что в плане автоматизации каких-либо простых действий и тот, и другой вариант скриптов — мощное орудие. Прочел я эту статейку, и подумал — а чем мы хуже? Возьму, да и опишу, как автоматизировать простые консольные действия с помощью python-скриптов, даром что это тема довольно широкая.

Поехали!


Чтобы сделать скрипт на языке Python исполняемым в консоли — нужно, чтобы первая строчка имела вид

#!/usr/bin/python

где /usr/bin/python — адрес интерпретатора Python, установленного в вашей системе. Ну и, естественно, пользователь, запускающий скрипт, должен иметь права для его выполнения. Что характерно, это будет работать только в NIX-системах. В Windows скрипты автоматически становятся исполняемыми при установке соответствия между программой-интерпретатором и типом файлов .py.

В целом скрипты Python во многом похожи на скрипты Bash, однако, на мой взгляд, они куда изящнее. Рассмотрим основные функции, которые могут нам понадобиться:

listdir(path)
Возвращает список имен файлов и папок в папке с именем path.

mkdir(path)
Создает папку с именем path.

makedirs(path)
Работает аналогично функции mkdir(), но автоматически создает все необходимые промежуточные папки.

remove(path)
Удаляет файл с именем path.

rmdir(path)
Удаляет каталог с именем path.

removedirs(path)
Работает аналогично функции rmdir(), но автоматически удаляет все родительские пустые папки.

rename(src, dst)
Переименовывает файл или папку с именем src в dst.

open(filename, flag)
Открывает файл с именем filename. Flag нужен для определения режима доступа: «r» — чтение, «w» — запись, «a» — дописывание.

read(size)
Считывает из файла данные размером size и возвращает в виде строки. Если аргумент опущен, то считывается все содержимое файла.

readline()
Считывает из файла одну строку, включая символ перехода на новую строку («\n»).

readlines()
Считывает из файла все строки и возвращает их в виде списка.

write(string)
Записывает строку string в файл.

writelines(lines)
Записывает строки из списка lines в файл. Символ перехода на новую строку между ними не добавляется.

tell()
Возвращает текущее положение в файле в байтах от начала файла.

seek(offset, whence)
Изменяет положение на offset. Характер определения положения зависит от аргумента whence (по умолчанию 0):
1) 0 – новое положение отсчитывается от начала файла;
2) 1 – от конца файла;
3) 2 – от текущего положения в файле;

truncate(size)
Усекает файл до размера size.

close()
Закрытие файла. Запомните! Любое открытие файла должно сопровождаться последующим закрытием с помощью этого метода.

А теперь — к более частным случаям.


Каша в голове? Ничего, сейчас мы разберем все подробнее.

Первым делом добавим немного интерактивности. Иначе смысл в нашем скрипте, если он ничего не будет спрашивать у пользователя? :) Для ввода с клавиатуры используется метод raw_input(). Почему не просто input()? Потому что при считывании строки через input() она пропускается через интерпретатор, преобразующий введенную строку в команду. Руки так и чешутся ввести rm -rf… Ну ладно, погнали дальше! Синтаксис у функции такой:

login = raw_input("Enter your name: ")
Здесь login — переменная, в которую считывается после нажатия Enter введенная пользователем строка.
Теперь давайте откроем файл и запишем в него какую-нибудь информацию.

gogo = open ("/home/username/helloworld","w")
gogo.write("Hello, world!")
gogo.close()


Кстати, рекомендую проверить, перед тем, как исполнять вышенаписанное, не завалялся ли у вас какой-нибудь нужный файл по адресу /home/username/helloworld? А то ведь все в нем сотрет и ничего не оставит на месте преступления, кроме «Hello, world!».

Ну а теперь давайте поработаем напрямую с консолью. Лично я в одном фрагменте кода доставал из выдачи команды host domen.com адрес хоста своего провайдера. Сказано — сделано.

import os
import re
vid = os.popen("host l2tp.corbina.ru")
re_dns = re.compile(r"([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)")
for line in vid.readlines():
&nbsp hst=re_dns.search(line)
&nbsp if (hst != None):
&nbsp &nbsp break
host=hst.group(0)
print "Corbina host adress is "+host


Ух ты, сколько всего… Ну, давайте разбираться. Построчно.

import os
import re

Подключаем стандартные библиотеки питона, чтобы все работало. os — библиотека для работы с системными вызовами и консолью. re — для работы с регулярными выражениями.

vid = os.popen ("host l2tp.corbina.ru")
Здесь мы как бы «вводим в консоль» команду host l2tp.corbina.ru, а то, что получилось, запихиваем в виде списка в переменную vid.

re_dns=re.compile(r"([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)")
Это, друзья мои, преобразование регулярного выражения. re_dns — это переменная, в которую записывается особый объект, полученный при помощи метода re.compile(). Сам синтаксис регулярного выражения я объяснять не буду, тем более что он простейший, скажу только — это самый простой вариант фильтра для IP-адресов.

for line in vid.readlines():
Здесь стартует цикл for. Думаю, вы уже заметили, что в языке Python синтаксис цикла for довольно сильно отличается от других языков. Здесь берется переменная line, в которую по очереди записываются строки из списка vid.readlines(). Закончатся строки в списке — закончится и цикл. Двоеточие в конце обозначает начало раздела операторов, которые происходят в цикле. Эти операторы должны отделяться табуляцией или несколькими пробелами. Как только мы написали все, что должно происходить в цикле — просто пишем очередной оператор с начала строки. Кстати, это также касается и условного оператора if, как видно ниже.

hst=re_dns.search(line)
А здесь мы применяем полученный ранее объект регулярного выражения к строке line, в результате чего в hst возвращается либо список подходящих под него строк, либо None в случае, если ничего не найдено.

if (hst != None):
&nbsp break

Проверка на тот самый None. Обратите еще раз внимание на отступ перед break. Как вы, наверное, знаете из других языков, этот самый break является оператором прерывания цикла. Таким образом, как только hst становится не равен None — цикл прерывается.

host=hst.group(0)
Как я уже говорил, в переменную hst возвращается список подходящих под регулярное выражение строк. На самом деле, точнее говоря, возвращается не список, а кортеж элементов. А поскольку мы прервали цикл, как только нашли первую подходящую строку — она и запишется в первый (он же нулевой) элемент кортежа, который мы благополучно достаем и записываем в host.

print "Corbina host adress is "+host
А потом выводим этот айпишник в консоль. Оператор print выводит переданную ему строку в консоль, да еще и допускает конкатенацию строк простым сложением.

Ну, собственно, вот и все для начала. Попрошу особо не ругать и не пинать за рваность повествования, если есть какие-то нарекания — с радостью прислушаюсь и постараюсь исправить.
Tags:
Hubs:
+63
Comments 93
Comments Comments 93

Articles