Как реализовать общие идиомы bash в Python?


7 Answers

Да, конечно :)

Взгляните на эти библиотеки, которые помогут вам никогда не писать сценарии оболочки снова (девиз Plumbum).

Кроме того, если вы хотите заменить awk, sed и grep на что-то Python, то я рекомендую pyp -

«The Pyed Piper», или pyp, представляет собой инструмент командной строки для командной строки linux, подобный awk или sed, но который использует стандартные методы строки и списка python, а также настраиваемые функции, созданные для быстрого получения результатов в интенсивной производственной среде.

Question

В настоящее время я выполняю манипуляции с текстовыми файлами через кучу плохо запоминаемых AWK, sed, Bash и крошечный бит Perl.

Я видел несколько мест, которые питон хорош для такого рода вещей. Как я могу использовать Python для замены сценариев оболочки, AWK, sed и друзей?




Ваш лучший выбор - это инструмент, специально предназначенный для вашей проблемы. Если он обрабатывает текстовые файлы, то Sed, Awk и Perl являются главными соперниками. Python - динамический язык общего назначения. Как и в случае с любым языком общего назначения, существует поддержка манипулирования файлами, но это не то, что является основной целью. Я бы рассмотрел Python или Ruby, если бы у меня было требование для динамического языка в частности.

Короче говоря, изучите Sed и Awk очень хорошо, плюс все другие лакомства, которые приходят с вашим вкусом * nix (все встроенные Bash-модули, grep, tr и т. Д.). Если вам нужна текстовая обработка файлов, вы уже используете нужный материал.




Я построил полудлинные сценарии оболочки (300-500 строк) и код Python, который выполняет аналогичную функциональность. Когда выполняется множество внешних команд, я считаю, что оболочка проще в использовании. Perl также является хорошим вариантом, когда есть много текстовых манипуляций.




Добавление к предыдущим ответам: проверьте модуль pexpect для работы с интерактивными командами (adduser, passwd и т. Д.).




Я приведу здесь свое мнение, основанное на опыте:

Для оболочки:

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

Для питона:

  • если вы хотите переносимость к включенным окнам, используйте python.
  • python может быть лучше, когда вы должны манипулировать только текстом, например, коллекциями чисел. Для этого я рекомендую python.

Я обычно выбираю bash для большинства вещей, но когда у меня есть что-то, что должно пересекать границы окон, я просто использую python.




Сначала было sh, sed и awk (и найти, и grep, и ...). Это было хорошо. Но awk может быть странным маленьким зверем и трудно запоминать, если вы его не используете часто. Тогда великий верблюд создал Перла. Perl был мечтой системного администратора. Это было похоже на сценарий оболочки на стероидах. Обработка текста, включая регулярные выражения, была лишь частью языка. Тогда это стало уродливо ... Люди пытались сделать большие приложения с Perl. Теперь, не поймите меня неправильно, Perl может быть приложением, но он может (может!) Выглядеть как беспорядок, если вы не очень осторожны. Тогда есть весь этот бизнес с плоскими данными. Этого достаточно, чтобы управлять орехами программиста.

Введите Python, Ruby и др. Это действительно очень хорошие языки общего назначения. Они поддерживают обработку текста и делают это хорошо (хотя, возможно, не так тесно связаны в основном ядре языка). Но они также расширяются очень хорошо, и в конце дня все еще есть красивый код. Они также создали довольно здоровенные сообщества с большим количеством библиотек для большинства вещей.

Теперь большая часть негативности в отношении Perl - это вопрос мнения, и, конечно же, некоторые люди могут писать очень чистый Perl, но с этим многие люди жалуются на то, что слишком легко создать запутанный код, вы знаете, что есть какая-то доля правды. Вопрос действительно станет тогда, вы когда-нибудь собираетесь использовать этот язык для более простых замен на скрипт bash. Если нет, узнайте еще несколько Perl .. это абсолютно фантастично для этого. Если, с другой стороны, вам нужен язык, который будет расти вместе с вами, как вы хотите сделать больше, могу ли я предложить Python или Ruby.

В любом случае, удачи!




Начиная с 2015 года и выпуска Python 3.4, теперь имеется достаточно полная интерактивная интерактивная оболочка, доступная по адресу: http://xon.sh/ или https://github.com/scopatz/xonsh

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

Xonsh ('conch') очень сильно пытается подражать bash, так что вещи, которые вы уже накопили для мышечной памяти, например,

env | uniq | sort -r | grep PATH

или

my-web-server 2>&1 | my-log-sorter

все равно будет работать нормально.

Учебник довольно длинный и, похоже, охватывает значительную часть функциональности, которую обычно ожидали бы в запросе ash или bash:

  • Компилирует, оценивает и выполняет!
  • История команд и вкладка
  • Помогите & Superhelp с ? & ??
  • Псевдонимы и индивидуальные подсказки
  • Выполняет команды и / или *.xsh скрипты, которые также можно импортировать
  • Переменные среды, включая Lookup с ${}
  • Перенаправление ввода / вывода и объединение
  • Фоновые задания и управление заданиями
  • Вложенные подпроцессы, трубы и сопроцессоры
  • Режим подпроцесса при наличии команды Python-mode в противном случае
  • Захваченный подпроцесс с $() , Uncaptured Subprocess с $[] , оценка Python с помощью @()
  • Имя файла Globbing с * или регулярным выражением Имя файла Globbing with Backticks



Если ваши манипуляции с текстовым файлом обычно одноразовые, возможно, сделанные в командной строке, вы не получите ничего лучшего от python.

С другой стороны, если вам обычно приходится повторять одну и ту же (или подобную) задачу снова и снова, и вы должны писать свои скрипты для этого, то python отлично подходит, и вы можете легко создавать свои собственные библиотеки (вы можете делать что и с shell-скриптами, но это более громоздко).

Очень простой пример, чтобы получить представление.

import popen2
stdout_text, stdin_text=popen2.popen2("your-shell-command-here")
for line in stdout_text:
  if line.startswith("#"):
    pass
  else
    jobID=int(line.split(",")[0].split()[1].lstrip("<").rstrip(">"))
    # do something with jobID

Проверьте также модуль sys и getopt, они первые, что вам понадобятся.




Related