Как реализовать общие идиомы удара в Python? [закрытый]

242
задан Chris Jefferson 13 April 2018 в 13:58
поделиться

8 ответов

Любая оболочка имеет несколько наборов функций.

  • Существенные команды Linux/Unix. Все они доступны через подпроцесс библиотека. Это - не всегда лучший предпочтительный вариант для того, чтобы сделать весь внешние команды. Посмотрите также shutil для некоторых команд, которые являются отдельными командами Linux, но Вы могли, вероятно, реализовать непосредственно в Ваших сценариях Python. Другой огромный пакет команд Linux находится в библиотека os ; можно сделать их проще в Python.

    И - премия! - более быстро. Каждая отдельная команда Linux в оболочке (за немногим исключением) разветвляет подпроцесс. При помощи модулей Python shutil и os Вы не разветвляете подпроцесс.

  • функции среды оболочки. Это включает материал, который устанавливает среду команды (текущий каталог и переменные среды и этажерка). Можно легко управлять этим из Python непосредственно.

  • функции программирования оболочки. Это - вся проверка кода статуса процесса, различные логические команды (если, в то время как, поскольку, и т.д.) тестовая команда и весь, он - родственники. Функциональный материал определения. Это - все очень, намного легче в Python. Это - одна из огромных побед в избавлении от удара и выполнении его в Python.

  • функции Interaction. Это включает историю команд и этажерку. Вам не нужно это для записи сценариев оболочки. Это только для человеческого взаимодействия, а не для записи сценария.

  • функции управления файлами оболочки. Это включает перенаправление и конвейеры. Это более хитро. Большая часть этого может быть сделана с подпроцессом. Но некоторые вещи, которые легки в оболочке, неприятны в Python. Конкретно наполните как (a | b; c ) | something >result. Это выполняет два процесса параллельно (с выводом a, как введено к b), сопровождаемый третьим процессом. Вывод от той последовательности выполняется параллельно с something, и вывод собран в файл, названный result. Это просто сложно для выражения на любом другом языке.

Определенные программы (awk, sed, grep, и т.д.) могут часто переписываться как модули Python. Не идите за борт. Замена, что Вы нуждаетесь и развиваете свой "grep" модуль. Не начинайте писать модуль Python, который заменяет "grep".

лучшая вещь состоит в том, что можно сделать это на шагах.

  1. AWK Замены и Perl с Python. Оставьте все остальное в покое.
  2. Взгляд на замену GREP с Python. Это может быть немного более сложно, но Ваша версия GREP может быть адаптирована в соответствии с Вашими потребностями обработки.
  3. Взгляд на замену НАХОДЯТ с циклами Python то использование os.walk. Это - большая победа, потому что Вы не мечете икру как много процессов.
  4. Взгляд на замену общей логики оболочки (циклы, решения, и т.д.) со сценариями Python.
144
ответ дан Armali 23 November 2019 в 03:12
поделиться

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

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

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

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 модуль, они являются первыми, Вам будет нужно.

1
ответ дан Davide 23 November 2019 в 03:12
поделиться

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

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

2
ответ дан Eric Smith 23 November 2019 в 03:12
поделиться

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

3
ответ дан Mike Davis 23 November 2019 в 03:12
поделиться

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

7
ответ дан Federico A. Ramponi 23 November 2019 в 03:12
поделиться

Я предлагаю потрясающее книжное Погружение онлайн В Python . Это - как я выучил язык первоначально.

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

9
ответ дан Dan Lenski 23 November 2019 в 03:12
поделиться

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

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

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

Так или иначе, удачи!

16
ответ дан MattG 23 November 2019 в 03:12
поделиться
  • , Если Вы хотите использовать Python в качестве оболочки, почему бы не взглянуть на IPython? Также хорошо выучить в интерактивном режиме язык.
  • , Если Вы делаете большое текстовое управление, и если Вы используете Vim в качестве текстового редактора, можно также непосредственно записать плагины для Vim в Python. просто введите ": Python справки" в Vim и следует инструкциям или взглянул на этот представление . Это так легко и способно записать функции, что Вы будете использовать непосредственно в Вашем редакторе!
31
ответ дан Catskul 23 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: