В настоящее время я выполняю свои манипуляции с текстовым файлом через кучу плохо запомнившихся AWK, sed, Bash и чуть-чуть Perl.
Я видел упомянутое несколько мест, где Python хорош для такого рода вещей. Как я могу использовать Python для замены сценариев оболочки, AWK, sed и друзей?
Ответы:
Любая оболочка имеет несколько наборов функций.
Основные команды Linux / Unix. Все это доступно через библиотеку подпроцесса . Это не всегда лучший выбор для выполнения всех внешних команд. Посмотрите также на shutil для некоторых команд, которые являются отдельными командами Linux, но вы, вероятно, могли бы реализовать их непосредственно в своих скриптах Python. Другая огромная партия команд Linux находится в библиотеке os ; Вы можете сделать это проще в Python.
И - бонус! -- быстрее. Каждая отдельная команда Linux в оболочке (за некоторыми исключениями) разветвляется на подпроцесс. Используя Python
shutil
иos
модули, вы не разветвляетесь на подпроцесс.Особенности среды оболочки. Это включает в себя материал, который устанавливает командную среду (текущий каталог и переменные среды и что-нет). Вы можете легко управлять этим напрямую из Python.
Особенности программирования оболочки. Это вся проверка кода состояния процесса, различные логические команды (если, while, for и т. Д.), Команда test и все ее родственники. Определение функций вещи. Это все намного проще в Python. Это одна из огромных побед в избавлении от bash и в Python.
Особенности взаимодействия. Это включает в себя историю команд и что-нет. Вам не нужно это для написания сценариев оболочки. Это только для человеческого взаимодействия, а не для написания сценариев.
Функции управления файлами оболочки. Это включает в себя перенаправление и конвейеры. Это сложнее. Многое из этого можно сделать с помощью подпроцесса. Но некоторые вещи, которые легко в оболочке, неприятны в Python. Конкретно такие вещи, как
(a | b; c ) | something >result
. Это запускает два процесса параллельно (с выводом вa
качестве входных данныхb
), а затем третий процесс. Вывод из этой последовательности выполняется параллельно,something
и вывод собирается в файл с именемresult
. Это просто сложно выразить на любом другом языке.Определенные программы (awk, sed, grep и т. Д.) Часто могут быть переписаны как модули Python. Не уходи за борт. Замените то, что вам нужно, и развивайте свой модуль "grep". Не начинайте писать модуль Python, который заменяет «grep».
Лучше всего, что вы можете сделать это поэтапно.
os.walk
. Это большая победа, потому что вы не создаете столько процессов.источник
find
скриптов, которые у меня есть, уродлива и длинна и не поддерживается в сравнении. Многие вещи должны быть сценариями оболочки, многие другие не должны . Не все должно быть только одним из Python или BASH (или что-то еще).(a | b; c ) | something >result
) несколько смягчен тем, что тривиально упрощается передача оболочек вsubprocess
методы, использующиеshell=True
Ну конечно; естественно :)
Взгляните на эти библиотеки, которые помогут вам больше никогда не писать сценарии оболочки (девиз Plumbum).
Кроме того, если вы хотите заменить awk, sed и grep чем-то, основанным на Python, я рекомендую pyp -
источник
Я только что обнаружил, как сочетать лучшие части bash и ipython. До сих пор это кажется мне более удобным, чем использование подпроцесса и так далее. Вы можете легко скопировать большие части существующих сценариев bash и, например, добавить обработку ошибок способом Python :) И вот мой результат:
См. IPython docs о командах системной оболочки и использовании его в качестве системной оболочки .
источник
filelines = ! cat myfile
$var
в команде оболочки? Вот это да. Это должен быть принятый ответ.Начиная с 2015 года и выпуска Python 3.4, теперь имеется достаточно полная интерактивная пользовательская оболочка, доступная по адресу: http://xon.sh/ или https://github.com/scopatz/xonsh.
В демонстрационном видео не показаны используемые каналы, но они поддерживаются в режиме оболочки по умолчанию.
Xonsh ('раковина') очень старается подражать bash, поэтому вещи, для которых вы уже приобрели мышечную память, например
или
все равно будет работать нормально.
Учебное пособие довольно длинное и, по-видимому, охватывает значительную часть функциональности, которую обычно ожидают при появлении команды ash или bash:
?
&??
*.xsh
сценарии, которые также могут быть импортированы${}
$()
, Неподхваченный подпроцесс с$[]
, Оценка Python с@()
*
или регулярное выражениеисточник
.xsh
расширение для файлов с кодом xonsh: github.com/xonsh/xonsh/issues/2478 . В противном случае вы должны использоватьevalx
для вызова его непосредственно из.py
файлов.источник
В начале были sh, sed и awk (и найти, и grep, и ...). Это было хорошо. Но awk может быть странным маленьким зверем, и его трудно запомнить, если вы не используете его часто. Тогда великий верблюд создал Perl. Perl был мечтой системного администратора. Это было похоже на скриптинг на стероидах. Обработка текста, включая регулярные выражения, была лишь частью языка. Тогда это стало ужасно ... Люди пытались создавать большие приложения с помощью Perl. Не поймите меня неправильно, Perl может быть приложением, но оно может (может!) Выглядеть беспорядком, если вы не очень осторожны. Тогда есть весь этот плоский бизнес данных. Этого достаточно, чтобы свести программиста с ума.
Введите Python, Ruby и др. Это действительно очень хорошие языки общего назначения. Они поддерживают обработку текста и делают это хорошо (хотя, возможно, не так тесно связаны с основным ядром языка). Но они также очень хорошо масштабируются и в конце дня все еще имеют красивый код. Они также создали довольно здоровенные сообщества с большим количеством библиотек для чего угодно.
Теперь, большая часть негатива по отношению к Perl - это вопрос мнения, и, конечно, некоторые люди могут писать очень чистый Perl, но из-за того, что многие люди жалуются на то, что слишком легко создавать запутанный код, вы знаете, что здесь есть доля правды. Тогда возникает вопрос: будете ли вы когда-нибудь использовать этот язык для более чем простой замены скриптов bash? Если нет, изучите еще немного Perl .. это просто фантастика. С другой стороны, если вам нужен язык, который будет расти вместе с вами, если вы хотите делать больше, я могу предложить Python или Ruby.
В любом случае, удачи!
источник
Я предлагаю удивительную книгу онлайн Dive Into Python . Это то, как я выучил язык изначально.
Помимо изучения базовой структуры языка и множества полезных структур данных, в нем есть хорошая глава по обработке файлов и последующие главы по регулярным выражениям и многое другое.
источник
Добавление к предыдущим ответам: проверьте модуль pexpect для работы с интерактивными командами (adduser, passwd и т. Д.)
источник
Одна из причин, по которой я люблю Python, заключается в том, что он гораздо лучше стандартизирован, чем инструменты POSIX. Я должен дважды и трижды проверить, что каждый бит совместим с другими операционными системами. Программа, написанная в системе Linux, может не работать так же в системе BSD OSX. С Python я просто должен проверить, что целевая система имеет достаточно современную версию Python.
Более того, программа, написанная на стандартном Python, будет работать даже на Windows!
источник
Я выскажу свое мнение на основе опыта:
Для оболочки:
Для питона:
Я обычно выбираю bash для большинства вещей, но когда у меня есть то, что должно пересекать границы окон, я просто использую python.
источник
pythonpy - это инструмент, который обеспечивает легкий доступ ко многим функциям из awk и sed, но с использованием синтаксиса python:
источник
Я создал полудлинные сценарии оболочки (300-500 строк) и код Python, который выполняет аналогичные функции. Когда выполняется много внешних команд, я считаю, что оболочка проще в использовании. Perl также является хорошим вариантом, когда много текстовых манипуляций.
источник
Исследуя эту тему, я нашел этот проверочный код (с помощью комментария на http://jlebar.com/2010/2/1/Replacing_Bash.html ), который позволяет вам «писать оболочечные конвейеры в Python, используя краткий синтаксис и использование существующих системных инструментов там, где они имеют смысл ":
источник
Ваша лучшая ставка - это инструмент, специально предназначенный для вашей проблемы. Если он обрабатывает текстовые файлы, то Sed, Awk и Perl являются главными претендентами. Python - это динамическая система общего назначения. язык . Как и с любым языком общего назначения, есть поддержка манипулирования файлами, но это не основная цель. Я бы рассмотрел Python или Ruby, если бы у меня были требования к динамическому языку, в частности.
Короче, выучите Sed и Awk очень хорошо, а также все другие вкусности, которые идут с вашим вкусом * nix (все встроенные функции Bash, grep, tr и так далее). Если вас интересует обработка текстовых файлов, вы уже используете правильные вещи.
источник
Вы можете использовать python вместо bash с библиотекой ShellPy .
Вот пример, который загружает аватар пользователя Python с Github:
Как видите, все выражения внутри серьезного символа акцента (`) выполняются в оболочке. А в коде Python вы можете фиксировать результаты этого выполнения и выполнять над ним действия. Например:
Эта строка сначала выполняется
git log --pretty=oneline --grep='Create'
в оболочке, а затем присваивает результат переменной log. Результат имеет следующие свойства:stdout весь текст из stdout выполненного процесса
stderr весь текст из stderr выполненного процесса
код возврата код выполнения
Это общий обзор библиотеки, более подробное описание с примерами можно найти здесь .
источник
Если ваши манипуляции с текстовым файлом обычно являются однократными, возможно, в командной строке, вы не получите ничего лучшего от python.
С другой стороны, если вам обычно приходится выполнять одно и то же (или похожее) задание снова и снова, и вы должны писать для этого свои скрипты, тогда Python великолепен - и вы можете легко создавать свои собственные библиотеки (вы можете сделать это тоже с помощью сценариев оболочки, но это более громоздко).
Очень простой пример, чтобы почувствовать.
Проверьте также sys и модуль getopt, они вам понадобятся первыми.
источник
Я опубликовал пакет на PyPI: ez .
Используйте
pip install ez
для его установки.Он упаковал общие команды в оболочке, и моя библиотека использует в основном тот же синтаксис, что и оболочка. например, cp (источник, место назначения) может обрабатывать как файлы, так и папки! (обертка shutil.copy shutil.copytree и она решает, когда использовать какую). Еще приятнее то, что он может поддерживать векторизацию как R!
Другой пример: нет os.walk, используйте fls (path, regex) для рекурсивного поиска файлов и фильтрации с регулярным выражением, и он возвращает список файлов с полным или без полного пути
Последний пример: вы можете комбинировать их для написания очень простых скриптов:
files = fls('.','py$'); cp(files, myDir)
Определенно проверьте это! Это стоило мне сотни часов, чтобы написать / улучшить это!
источник