LINUX.ORG.RU

Python в помощь администратору.


0

4

Чем этот язык может помочь сисадмину? Не программисту! Чем он лучше shell? На питоне, так и так, пол кода будет состоять из команд Линукс. Не ради холливара, а просто разобраться. Понять, нужен он конкретно мне или нет.



Последнее исправление: SexualOpenSourceCode (всего исправлений: 1)
Ответ на: комментарий от true_admin
#!/usr/bin/python

''' cat /dev/sda | pv | tee /dev/sdb > /dev/sdc || echo "Zopa" 
analog
'''

def copy(inp, outp, outp2):
    b = '0'
    while b != '':
        b = read(inp, 2*1024*1024)
        write(outp, b)
        write(outp2, b)

a = open('/dev/sda', 'r')
b = open('/dev/sdb', 'w')
c = open('/dev/sdc', 'w')

try:
    copy(a,b,c)
except:
    print '''Error:

Can't copy''' + e.string
AGUtilities ★★★
()
Ответ на: комментарий от true_admin

> Я заигнорил выскочку SexualOpenSourceCode
Признал своё поражение и тебе ничего не оставалось, как заигнорировать меня. Печаль.

SexualOpenSourceCode
() автор топика
Ответ на: комментарий от AGUtilities

Вот видишь, в 13 раз больше строк кода. Конечно, у этого подхода есть свои плюсы. Например, можно крутить размеры буферов(у пайпа он всего 4к), нет многочисленного копирования между процессами, функция copy может принимать любое кол-во аргументов(если чуток допилить), можно использовать какой-нить sendfile для оптимизации процесса итп.

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

К тому же ты упустил pv который показывает сколько скопировано(а если чуток допилить то покажет и сколько осталось).

Итого: на порядок больше строк, а функционал всё равно проигрывает.

Всё же круче перла ничего не придумано для написание админских скриптов.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

можно увидеть элегантный аналог вот этого:

Легко, когда в питоне нужен шелл, просто используй его:

from subprocess import Popen

Popen(['sh', '-c', 'cat /dev/sda | pv | tee /dev/sdb > /dev/sdc || echo "Zopa"']).wait()
baverman ★★★
()
Ответ на: комментарий от AGUtilities

прогресс легко добавляется

Это лишние строки и к итак раздутому примеру.

baverman ★★★
()
Ответ на: комментарий от AGUtilities

прогресс легко добавляется статической переменной и командой print

во-во, свои костыли городить, а в шелле уже всё готово. Короче, питон слил.

Я пытался сделать что-то типа этого:

cmd('cat ...') | pv | ...
copy(src='file1', dst='file2')

где cmd это объект-обёртка над subprocess, pv это просто cmd('pv') итп. Но это всё жуткий костылинг и не всё можно реализовать в рамках питона. Да и смотрелось страшновато. И достаточно сложно в реализации. В итоге забил.

Но всё же пару скриптов со сложной логикой на питон переписал(защита от ddos). Работало на порядок быстрее чем на баше.

true_admin ★★★★★
()
Ответ на: комментарий от rg-400

а зачем тогда python?

Условия и циклы же. То, с чем у баша традиционно плохо. Обработка строк до кучи.

Зачем отказываться от прелестей шелла? Питон (как и другие скриптовые ЯП) позволяет по максимуму задействовать существующие практики. А чистые решения пущай городят фанатики и хаскелисты.

baverman ★★★
()
Ответ на: комментарий от true_admin

а я и не говорил, что питон нужно использовать при каждом чихе: просто сделал аналог вашей строчки, и всё. зато этот аналог можно допиливать как хочешь, а bash той строчкой и ограничится

я говорил что питон нужен для более сложных вещей чем пайпинг файлов, а именно, на пример, сложного комплексного переименования файлов.

AGUtilities ★★★
()
Ответ на: комментарий от true_admin

Я пытался сделать что-то типа этого:

Объясни, ради всего святого, зачем??? Есть шелл с давно изученным синтаксисом. Работающий. Нафига городить нативный кривой DSL? Тем более проблемы вызвать какой угодно сложный конвейер нет вообще.

baverman ★★★
()

к стати, а в bash можно сделать так?

import gtk

win = gtk.gdk.get_default_root_window()
width, height = win.get_size()
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, width, height)
pb = pb.get_from_drawable(win, win.get_colormap(), 0, 0, 0, 0, width, height)
for i in range(1,25):
    pb.save('path_to_file'+str(i)+'.jpg', 'jpeg', {"quality":"75"})
AGUtilities ★★★
()
Ответ на: комментарий от SexualOpenSourceCode

В тред в срочном порядке реквестируются годные читабельные скрипты на sh (можно на bash, csh, zsh & K°), длинной от 500 строк.

Давай дядя, не стыдись, вываливай красоту, посмеемся всем лором.

baverman ★★★
()
Ответ на: комментарий от SexualOpenSourceCode

Хочется увидеть аналог на баше, моей грабилки корованов:

#!/usr/bin/env python

import sys
from subprocess import Popen, PIPE
import re

out, err = Popen(['/usr/bin/env', 'xwininfo', '-stats'],
    stderr=PIPE, stdout=PIPE).communicate()

if err:
    print err
    sys.exit(1)
    
    
match = re.search(r'(?s)Absolute upper-left X:\s+(\d+).*?Absolute upper-left Y:\s+(\d+).*?Width:\s+(\d+).*?Height:\s+(\d+)', out)
if not match:
    print "Can't parse:\n" + out
    sys.exit(1)
    
x, y, w, h = map(int, match.group(1, 2, 3, 4))

Popen(['/usr/bin/env', 'import', '-window', 'root', 
    '-crop', '%dx%d+%d+%d' % (w, h, x+1, y+1), sys.argv[1]]).poll()

Как можно заметить, вызываются внешние команды, попробуй упаковать это в шелл скрипт, родной.

baverman ★★★
()
Ответ на: комментарий от baverman

> В тред в срочном порядке реквестируются годные читабельные скрипты на sh (можно на bash, csh, zsh & K°), длинной от 500 строк.
вот специально для тебя напишу в 500 строк и выложу.

SexualOpenSourceCode
() автор топика
Ответ на: комментарий от baverman

Я понимаю твой праведный гнев :).

Объясни, ради всего святого, зачем???

А шелл тоже очень кривое поделие(отсутствие типизации, именованные аргументы итп). И часто его возможностей не хватает, либо они костыльные. Например, работа с числами с плавающей запятой(вот однажды понадобилось), взаимодействие с СУБД(было нужно для бэкапных скриптов) итп. Мне не хватает нормальной работы с массивами. Ну и скорость плохая на большом объёме данных. Или работа с айпишниками. У питона есть модуль ipaddr :)

В общем, иногда мне везёт на задачи которые и на питон плохо ложаться и на шелл. Иногда проблемы в самом языке, иногда либ не хватает...

Тем более проблемы вызвать какой угодно сложный конвейер нет вообще.

Ммм, в данном случае да. Просто классические пайпы могут передавать только текст, а питоновские объекты могут между собой и объектами обмениваться. Для сложных структур данных это актуально.

true_admin ★★★★★
()
Ответ на: комментарий от SexualOpenSourceCode

man scrot

и что, установка скрота - быстрее нескольких строк на питоне? и что, скрот кроссплатформинен, да?

и к стати, а bash поддерживает UTF-8?

AGUtilities ★★★
()
Ответ на: комментарий от AGUtilities

а в bash можно сделать так?

по-нормальному нет. Это то о чём я говорил, иногда рулит баш, иногда питон. А хочется универсального решения. Типа перла :). Но, конечно, не стоит превращать питон в перл.

true_admin ★★★★★
()
Ответ на: комментарий от SexualOpenSourceCode

вот специально для тебя напишу в 500 строк и выложу.

А какие проблемы выложить уже готовый, написанный кем-то другим?

baverman ★★★
()
Ответ на: комментарий от true_admin

Это то о чём я говорил, иногда рулит баш, иногда питон

Но ведь в питоне можно использовать баш! Как, впрочем, и наоборот.

baverman ★★★
()
Ответ на: комментарий от AGUtilities

а bash поддерживает UTF-8?

грубый ответ: поддерживает. Ему вообще на него пофиг, это проблема тех утилит которые работают с текстом. А у sed, awk, grep итп проблем нет.

true_admin ★★★★★
()
Ответ на: комментарий от baverman

Но ведь в питоне можно использовать баш!

когда 50% кода это subprocess.Popen начинаешь по-неволе задумываваться. Вот я и ищу «лёгкий» способ интегрировать вызов внешних прог в питон.

true_admin ★★★★★
()
Ответ на: комментарий от AGUtilities

зато этот аналог можно допиливать как хочешь, а bash той строчкой и ограничится

я об этом писал :). Просто хочется сделать так чтобы питон не хромал на таких примитивных операциях. А вот пока идей как это малой кровью пофиксить нету.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

грубый ответ: поддерживает

правильный ответ: не поддерживает

работает только с mb_string

А у sed, awk, grep итп проблем нет.

это спорно. приведите, пожалуйста пруфы что перечисленные утилиты поддерживают юникод

AGUtilities ★★★
()
Ответ на: комментарий от baverman

> А какие проблемы выложить уже готовый, написанный кем-то другим?
Свой напишу. Клевый :)

SexualOpenSourceCode
() автор топика
Ответ на: комментарий от SexualOpenSourceCode

В баше нужны кодировки?

а почему нет?

вот понадобится тебе что-то сделать юникодо требовательное и... придётся вспомнить про родной питончик.

AGUtilities ★★★
()
Ответ на: комментарий от AGUtilities

правильный ответ: не поддерживает

можно пример где с этим проблемы?

приведите, пожалуйста пруфы что перечисленные утилиты поддерживают юникод

d520@~$ echo ТЕСТ | grep -i тест
ТЕСТ
d520@~$ locale
LANG=
LC_CTYPE=ru_RU.UTF-8
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES=C
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

Для меня такой уровень поддержки достаточен.

true_admin ★★★★★
()

Bash для администрирования лучше, все-таки. Зачем изучать целый язык с нуля, такой как питон, перл, руби, чтобы делать, в конечном итоге, то же самое? А начать осваивать C/C++, asm и перестать боятся стереотипного «сложного синтаксиса».

SexualOpenSourceCode
() автор топика
Ответ на: комментарий от SexualOpenSourceCode

А он все набрасывает и набрасывает. Что ж, лоровские добряки всегда готовы тебя прикормить.

baverman ★★★
()
Ответ на: комментарий от dizza

Универсальное решение «типа перла» - это Ruby.

не могу проверить это :). Три года назад я много времени убил ковыряясь в его сырцах. Оказалось он в принципе не умел того что нужно и эта проблема решалась модулем open3. Если сейчас всё так же плохо(не умеет из коробки ждать завершения потомка) то руби тут не далеко ушёл от питона.

Т.е. всё что требовалось это дождаться завершения комманды и вывести её статус. Вот так оно не работало:

`program`
print $?

Сейчас что-нибудь изменилось?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Другим советую

Лапочка, ты же писал разумные вещи. И вдруг такой конфуз... Не давай советов, чьи посты читать, окей?

Xenesz ★★★★
()
Ответ на: комментарий от true_admin

искал подходящий пример для bash, но видимо уже пофиксили. но это не значит что у баша с mb_string не будет ещё каких-нибудь ошибок. наверняка будут.

но вот awk:

#cat > awk.txt
A Only_a_singlebyte_character_here_(UTF-8:_41)
Ö A_letter_which_takes_two_bytes_(UTF-8:_c3_96)
€ A_currency_symbol_which_takes_three_bytes_(UTF-8:_e2_82_ac)
#cat awk.txt | awk '{ printf "%-5s%s\n",$1, $2 }'
A    Only_a_singlebyte_character_here_(UTF-8:_41)
Ö   A_letter_which_takes_two_bytes_(UTF-8:_c3_96)
€  A_currency_symbol_which_takes_three_bytes_(UTF-8:_e2_82_ac)
AGUtilities ★★★
()
Ответ на: комментарий от AGUtilities

http://ru.wikibooks.org/wiki/Vim

Если у вас нет консольной версии mueller, но есть много энтузиазма, то можно поступить так:

  • Идем на http://sourceforge.net/projects/mueller-dict/ и забираем оттуда mueller-dict-3.1.1.tar.gz
  • Извлекаем из полученного архива файл mueller-base.dict.dz и кладем его, скажем, в ~/dict/
  • Там же создаем файл mueller-base.sh со следующим содержимым:
    #!/bin/bash
    # 
    WORD=`echo $1 | tr 'A-Z' 'a-z'`;
    LINES=30;  
    DICTIONARY="$HOME/dict/mueller-base.dict.dz"; 
    # 
    zcat $DICTIONARY | \
      sed -rn -e 's/^[^ ]/\n\t&/g;p' | \
      awk 'BEGIN { RS = "\t"; FS = "\n\n" } $1 ~ /^'$WORD'$/ { print $0 }' | \
      sed -e '/^$/d' | \
      head -n $LINES  
    #
    
$ ./mueller-base.sh head

*** Аналог на чистом Python в студию, плз! ***

anonymous
()
Ответ на: комментарий от anonymous

Зачем писать костыль на чистом питоне?

Нужно один раз спарсить словарь в любую базу, а потом доставать нужное запросом.

g1itch
()
Ответ на: комментарий от true_admin

ХЗ такое делать не приходилось. Но парсить им довольно таки удобно благодаря встроенным регэкспам.

dizza ★★★★★
()
Ответ на: комментарий от g1itch

> Зачем писать костыль на чистом питоне?

Читай subj. Не умеешь - не лезь в обсуждение.

Нужно один раз спарсить словарь в любую базу, а потом доставать нужное запросом.

Вот и напиши. Выложи тут. А мы сравним.

anonymous
()
Ответ на: комментарий от dizza

> Но парсить им довольно таки удобно благодаря встроенным регэкспам.

Если удобно, напиши на Ruby парсинг mueller-base.dict.dz в виде консольного словарика. Будет интересно твоё решение.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.