LINUX.ORG.RU

Использовании python как замена (почти) bash для скриптов

 , ,


0

2

Всем привет. Видел несколько тем на форуме, но там немного другой характер вопроса. Я сейчас в ситуации, когда приходится использовать и линукс, и окна. Поэтому я хочу унифицировать в скрипте ряд действий, которые приходится постоянно делать.

Для примера возьмем imagemagick и ghostscript. На вход я передаю путь до папки с кучей сканов в pdf и ключ объединения (объединять все pdf в один или оставить в разных файлах). Не считая разных команд (в окнах IM используется через команду magick, а в линуксе через convert), все остальное одинаковое. Я прочитал про subprocess и его метод run. В данном случае он будет уместен? Т. е. код такого вида

if sys.platform.startswith("linux"):
    subprocess.run(['convert', '-density 300', '-quality 85%', inputFile, outputFile])
elif sys.platform.startswith("win"):
    subprocess.run(['magick', '-density 300', '-quality 85%', inputFile, outputFile])
else:
    print('Платформа не поддерживается')

Правильно я применяю subprocess? И как в данном случае унифицировать отлавливание ошибок? Естественно внедрением каких-то серьезных вещей, вроде модулей логера или юнит-тестов я заниматься не буду. Это просто элементарные скрипты для упрощение части рутины.

И вообще, как сейчас смотрится идея использования python как замена для bash, кроме случае с однострочниками? Предполагается использование subprocess для обращения к программам.

Есть в fabric, страшно как ад, отвратительно и не нужно. Используюется теми, кто шелл не умеет и боится его как калёного железа. Ты бы лучше в сторону scsh посмотрел. Вот такого на питоне только не будет.

anonymous ()

Питон не нужно использовать как замену bash. Bash скрипт нужен для того, чтобы не надо было набирать команды руками в терминале. Питон (и любой другой яп) нужен для того, чтобы писать программы, т.е. логику, циклы, условные переходы, функции и т.д. На баше тоже можно написать программу, но это смысла не имеет. Питон не нужно использовать вместо баша, а баш не нужно использовать вместо питона.

yvv ★★☆ ()

Вообще идея так себе. Я в свое время задавался тем же вопросом что и ты. Пытался использовать питон как шелл скрипт. В общем ничего хорошего из этого не вышло. Понял что все мои желания в этом русле были основаны исключительно на незнании bash.

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

Serbis ()

Погляди на ipython и в частности на директиву !.

У него много магии есть из коробки если надо да и в целом популярная штука у питонистов.

In [1]: cd /home                                                                                                                                                                             
/home

In [2]: l = !ls                                                                                                                                                                              

In [3]: l                                                                                                                                                                                    
Out[3]: ['mrd', 'steam']

In [4]: list(filter(lambda x: x.startswith('m'), l))                                                                                                                                         
Out[4]: ['mrd']

Так что в принципе Python можно использовать как замену неуклюжему bash, но нужно понимать что все равно придется изучить его (bash) хотя бы для поддержания чужих скриптов на работе.

deterok ★★★★★ ()

Автор мыслит в правильном направлении

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

Эта статья поможет отбить желание использовать bash https://habr.com/ru/company/mailru/blog/311762/

Питон вещь универсальная и не ограниченная в возможностях, он есть в любом дистрибутиве. Есть даже Embedded вариант

ism ★★ ()
Последнее исправление: ism (всего исправлений: 2)
Ответ на: комментарий от beaver

Блин, а я чет недочитал пост ТС что там оказывает матдай еще. Ну тогда да, к башу еще powershell так же по книжке изучить и экзамплы поделать. И тогда будет идилия :D

Serbis ()

И вообще, как сейчас смотрится идея использования python как замена для bash, кроме случае с однострочниками? Предполагается использование subprocess для обращения к программам.

Питон и шелл не взаимозаменяемы. Если больше вызовов внешних программ и пайпов, чем логики и/или обработки текста, то больше подходят sh/make, иначе питон.

slovazap ★★★★★ ()

Во-первых, есть PowerShell, который заменяет все эти кривые поделия и говна мамонта, начиная с cmd.exe и заканчивая башем.

Во-вторых, бидон отвратителен как шелл, в том числе из-за синтаксиса(невозможны однострочники итд)

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

Что это за ведьминская магия? А как ipython обработает нечитаемые символы в выдаче ls? Уж не в кривые строки ли превращает?

Вон товарищ ism ссылку оставил, где сказано что результат ls адекватно не парсится. Только это не потому что баш плохой, а питон хороший, а потому что программист на фортране и на питоне как на баше пишет.

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

Python просто захватывает вывод на стандартные потоки, ничего более. Далее происходит сплит по строчкам, если ты этого желаешь. По нормальному нужна обвязка для каждого приложения отдельно, либо унификация вывода. Так что все вот эти примеры с использованием ipython как шела разбиваются о то, что нужно уметь парсить вывод каждого приложения по своему. И да, ipython не панацея, он просто позволяет писать понятно.

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

Bash скрипт нужен для того, чтобы не надо было набирать команды руками в терминале. Питон (и любой другой яп) нужен для того, чтобы писать программы, т.е. логику, циклы, условные переходы, функции и т.д.

А теперь поясни разницу. В питоне становится нужно набирать команды руками?
Баш нужен потому, что за последние 50 лет так и не удалось побороть базовые принципы построения никсов в виде мусорки из утилит в /bin и /usr/bin, которые связываются между собой примитивнейшим пайпом. Поттеринг как бы говорит «всё, хорош, компы уже поголовно многоядерные, этот труп пора закапывать, а то воняет», но люниксоиды продолжают ныть, мол «мы необучаемые, куда же нам новые инструменты изучать, нет, верните мне баш, хочу команды по одной вызывать».

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

Питон и шелл не взаимозаменяемы. Если больше вызовов внешних программ и пайпов, чем логики и/или обработки текста, то больше подходят sh/make, иначе питон.

А так: ?

>>> from plumbum import FG, BG
>>> (ls["-a"] | grep["\\.py"]) & FG         # The output is printed to stdout directly
build.py
.pydevproject
setup.py
>>> (ls["-a"] | grep["\\.py"]) & BG         # The process runs "in the background"
<Future ['/bin/grep', '\\.py'] (running)>
>>> from plumbum.cmd import sudo
>>> print sudo[ifconfig["-a"]]
/usr/bin/sudo /sbin/ifconfig -a
>>> (sudo[ifconfig["-a"]] | grep["-i", "loop"]) & FG
lo        Link encap:Local Loopback
          UP LOOPBACK RUNNING  MTU:16436  Metric:1

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

Во-вторых, бидон отвратителен как шелл, в том числе из-за синтаксиса(невозможны однострочники итд)

Отличные истории. То у одного лямбду, видите ли, нельзя на нескольких строках написать, то у другого нельзя в одну строчку писать. Вы там определитесь уже.

(lambda Y: (lambda while_loop: (lambda x: while_loop(x))(5))(Y(lambda while_loop: (lambda x: (lambda x: while_loop(x))(x+4) if x < 20 else __print(x)))))(lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args))))
Это однострочный аналог програмы:
x = 5
def while_loop(x):
    if x < 20:
        x = x + 4
        while_loop(x)
    else:
        print x
while_loop(x)

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

В питоне становится нужно набирать команды руками?

Не нужно, но тоже можно. Заменять им командную оболочку глупо, т.к. он не для этого предназначен.

yvv ★★☆ ()

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

yvv ★★☆ ()

Если нужно запускать программы, которые работают с файлами не вижу причин тащить сюда питон. У него неудобный синтаксис, он многословен, чтобы банально запускать программы надо подключать библиотеку и читать документацию и все равно можно прострелить себе ногу.

Для запускания программ есть bash и make.

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

Это смотря какие скрипты. Если тебе нужны find, grep, sed и т.д., то баш скрипт нужен как раз для того, чтобы их исполнять. В баше тоже можно написать программу, но не нужно.

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

Даже в многострочнике обычный по сути цикл по глубине рекурсии отваливается. А то что ты ужал в одну строку и программа в четыре раза быстрее падать стала - это не аналог а стыдобище.

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

Ну чел сам напросился на однострочник, я не виноват, что его тяжело читать. Вот так проще?

(lambda Y:
  (lambda while_loop:
    (lambda x: while_loop(x)) (5)
  ) (Y (lambda while_loop:
      (lambda x:
        (lambda x:
          while_loop(x)
        ) (x+4)
        if x < 20 else print(x)
      )
    )
  )
) (lambda f: (lambda x: x(x))
    (lambda y: f(lambda *args: y(y)(*args)))
  )

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

Эта статья поможет отбить желание использовать bash https://habr.com/ru/company/mailru/blog/311762/

В названиях файлов в текущей папке...

Может изменить папку с ./some/dir на ~/myProject/some/dir

Так что cd может отправить скрипт в ошибочную папку

чтобы показать, что папка найдена через CDPATH

Виндузятники рассказывают друг другу ужасы о bash.

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

Фигня какая-то, есть же божественный xonsh.

ls -l
import numpy as np
for l in np.arange(0, 1, .1):
    echo Hello @(i)

Использую как основной шелл, все офигенно

t184256 ★★★★★ ()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от byko3y

Еще один юзабилити-кошмар, забудьте вы уже об этой дряни! Есть же xonsh.

Сравни:

>>> from plumbum import FG, BG
>>> (ls["-a"] | grep["\\.py"]) & FG         # The output is printed to stdout directly
>>> (ls["-a"] | grep["\\.py"]) & BG         # The process runs "in the background"
>>> from plumbum.cmd import sudo
>>> print sudo[ifconfig["-a"]]
/usr/bin/sudo /sbin/ifconfig -a
>>> (sudo[ifconfig["-a"]] | grep["-i", "loop"]) & FG
$ ls -a | grep '\\.py'
$ ls -a | grep r'\.py' &
$ print(sudo ifconfig -a')
$ sudo ifconfig -a
$ sudo ifconfig -a | grep -i loop
t184256 ★★★★★ ()
Последнее исправление: t184256 (всего исправлений: 1)

Вот так твой код выглядел бы на xonsh:

if sys.platform.startswith("linux"):
    convert -density 300 -quality 85% @(inputfile) @(outputfile)
elif sys.platform.startswith("win"):
    magick -density 300 -quality 85% @(inputfile) @(outputfile)
else:
    print('Платформа не поддерживается')
t184256 ★★★★★ ()
Ответ на: комментарий от byko3y

Чеел, ты простой цикл оптимально написать не можешь, подозреваю, твой код всегда тяжело читать.

Ты с написанием не справился

Было: программа с определенной функцией while_loop(x); при х=-1000 все работало. При макс глубине рекурсии 1000 при х=-4000 уже не считает

Стало: функцию не определил, аргументы ручками вставлять надо, -1000 уже не подставить.

Вывод: не аналог, а ухудшение

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

По дефолту нужен shell. Могут быть проблемы с окружением. После запуска shell'а можно уже что угодно запустить запустить. Например ipython очень плохо себя чувствует как shell по умолчанию. Нужно окружения настраивать руками.

deterok ★★★★★ ()