Audytor.ru

Теплоснабжение "Аудитор"
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Глава 6. Запуск Python из PowerShell

Глава 6. Запуск Python из PowerShell

До сих пор наш подход к интеграции Python с PowerShell состоял в запуске сценариев PowerShell из Python в качестве некого подпроцесса < Прим. пер.: синхронного или асинхронного >. В этой главе их роли поменяются и PowerShell будет питать данными сценарии Python. Одним из ключевых элементов PowerShell выступает организация конвейера самого процесса передачи полученных результатов от одного CmdLet другому. Имея это в виду, почему бы не воспринимать Python протсо как другой элемент конвейера и исполнять сценарии Python, управляемые получаемыми от PowerShell данными?

Реверс ролей из PowerShell в Python

Для иллюстрации данного метода потребуются и сценарий PowerShell, и сценарий Python. Мы начнём с некого простого сценария PowerShell для передачикакой- то строки даных в конвейере и отображении этих данных из своего сценария Python.

Изучение сценария PoerShell

Давайте изучим подробности своего показанного на Рисунке 6-1 сценария PowerShell. Этот сценарий разбивается на четыре простые этапа:

Определение локальной переменной $Python с установленным полным путём к самому выбранному вами исполняемому файлу интерпретатора Python. Для днного примера мы снова будем применять Python 3.x.

Задание некой локальной переменной $Script, которая определяет значение полного пути к тому сценарию Python, который будет исполняться.

Установление локальной переменной $Message, которая будет передана через устанавливаемый конвейер в наш сценарий Python.

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

Рисунок 6-1


Сценарий PowerShell BasicOne.ps1

Изучение соответствующего сценария Python

Рассматривая свой соответствующий сценарий Python, показанный на Рисунке 6-2, мы видим, что он также разбивается на четыре раздела:

Некий блок комментария, который определяет то что выполнит данный сценарий.

Импорт стандартной библиотеки Python sys. Она требуется для обработки тех данных, которые передаются через конвейер.

Вывод на печать сообщений, доставляемых в Python для демонстрации исполнения данного сценария Python.

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

Рисунок 6-2


Сценарий Python BasicOne.py

Исполнение совмещённых PowerShell для сценариев Python

Рисунок 6-3 отображает получаемый в результате вывод, вырабатываемый нашим сценарием PowerShell, управляющим соответсвующим сценарием Python. Вы заметите, что в нашем выводе PowerShell появляется вывод как из сценария PoweShell (CmdLet write-host), так и из операторов Python (print).

Рисунок 6-3


Исполнение BasicOne.ps1 управляющего BasicOne.py

Применяя данный метод, давайте теперь изучим более интересное применение своего показаного здесь метода BasicOne.

Извлечение возможных собственных имён из текстовых документов

В этом примере наш сценарий PowerShell будет использовать CmdLet Get-ChildItem и CmdLet Get-Content для получения содержимого текстового файла и передачи всего содержимого в некий сценарий Python. Данный сценарий Python обработает переданное содержимое и снова применит метод BaseOne и попытается выделить возможные подходящие названия.

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

Но для начала, что такое собственные имена?

Языкознание определяет собственные имена как такие слова, которые представляют человека, место, группу, организацию или вещь, которая обычно начинается с заглавной буквы. К примеру, собственные имена в отдельном слове (такое как Дэвид, Смит, Кэрол, Вашингтон, Канада, Пентагон, Конгресс или Apple) могут предоставлять контекст и значение для расследования. В обычных текстах такие собственные имена скорее всего пишутся с заглавной буквы и их легко разобрать, выявить, пересчитать и рассортировать. Следует отметить, что не все будут следовать выделению заглавной буквой имён собственных; однако, смартфоны, прикладные программы текстовых сообщений, программы электронной почты, процессоры обработки слов и даже окно обмена сообщениями Skype автоматически выделяют их заглавными для нас. Таким образом, их выделение и ранжирование может предоставлять быстрый поиск и обеспечивать перспективу для расследования.

Читайте так же:
Лучший счетчик банкнот с детекцией

Изучение сценария PoerShell

Рисунок 6-4 показывает соответствующий сценарий PowerShell, который доставит всё содержимое этих файлов в более сложный сценарий Python, который и выполнит необходимые извлечение и ранжирование всех возможных собственных имён. Отметим, что для этого примера был добавлен новый элемент для возможности обработки множества файлов.

Рисунок 6-4


Сценарий ProperNames PowerShell

Данный сценарий был разбит на шесть этапов. Определим здесь каждый из них:

Определение локальной переменной $Python с установленным полным путём к самому выбранному вами исполняемому файлу интерпретатора Python. Для днного примера мы снова будем применять Python 3.x.

Задание некой локальной переменной $Script, которая определяет значение полного пути к тому сценарию Python, который будет исполняться.

Установление локальной переменной $targetPath, которая указывает имя пути назначения и типов обрабатываеемых файлов.

Применяем CmdLet Get-ChildItem для получения всех имён из тех файлов, которые соответствуют предоставленному значению расширения.

Записываем информацию в тот хост, который содержит перечень файлов, обследованных CmdLet Get-ChildItem.

Применяя цикл ForEach, обрабатываем все перечисленные в своей локальной переменной $files файлы. Внутри этого цикла наш сценарий выводит на печать все имена из каждого файла, затем выделяет полученное сырое содержимое данного файла и отправляет конвейером полученное в результате содержимое в наш сценарий Python.

Изучение соответствующего сценария ProperNames Python

Наш сценарий Python приводится в Листинге 6-1, разбитом на шесть основных разделов озаглавленных так:

Определение списка стоп- слов

Выделение собственных имён

Основной элемент программы

Вывод на печать получаемых в результате возможных имён собственных

Импорт библиотек : Как и подразумевает его название, это именно то место, в котором загружаются необходимые библиотеки Python. Они включают:

sys: Как было показано в BasicOne, эта библиотека позволяет нам орбрабатывать ввод командной строки, доставляемый со стороны PowerShell.

re: Это библиотека регулярных выражений Python, которая применяется в данном сценарии для снятия внешних символов из получаемого текста для упрощения поиска собственных имён.

datetime: Как и подразумевает её название, данная библиотека предоставляет методы для отображения и вычисления деталей времени и даты.

Определение списка стоп- слов : Данный раздел создаёт некий список стоп- слов, которые применяются внутри нашего сценария для устранения слов, которые не производят возможных значений при получении собственных имён. Они представляют собой на самом деле те слова, которые обычно начинают последовательности, которые могут выделяться заглавными. Тем самым, исключение данных слов из наших результатов произведёт улучшение получаемого результата.

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

Выделение собственных имён : Именно это составляет функцию ядра нашего сценария, которая обрабатывает передаваемое в конвейере содержимое из нашего сценария PowerShell. Данная функция будет вызываться для каждой обрабатываемой из стандартного ввода строки. Эта функция выделяет возможные собственные имена из строки на входе и добавляет их в свой словарь. Если это имя уже имеется в данном словаре, наша функция обновляет значение этого словаря, которое содержит частоту вхождения для такого конкретного возможносго собственного имени.

Основной элемент программы : Наша основная программа вначале выводит на печать несколько сообщений заголовка. Затем создаёт некий пустой properNamesDictionary. После этого, как и в примере BasicOne.py, этот сценарий обрабатывет все строки из стандартного системного входа, предоставляемого нашим сценарием PowerShell. Каждая строка затем преобразовывается при помощи заданного регулярного выражения для исключения не- альфа символов. Все преобразованные строки передаются в нашу функцию ExtractProperNames совместно с текущим properNamesDictionary. Этот процесс повторяется после этого для каждой предоставляемой нашим сценарием строки.

Читайте так же:
Дозиметры радиометры счетчики гейгера

Вывод на печать получаемых в результате возможных имён собственных : Данный окончательный раздел сортирует полученный в результате словарь по числу обнаруженных вхождений (более высокие значения первыми), а потом выводит на печать каждое собственное имя и связанное с ним значение счётчика.

Листинг 6-1. Сценарий Python ProperNames.py

Исполнение совмещённых PowerShell для сценариев ProperNames Python

После этого мы выполнили свой сценарий PowerShell в небольшом каталоге текстовых файлов. Эти файлы были сохранены в папке C:PSText для упрощения доступа. Вы можете изменить имя папки назначения в переменной $targetPath. Результаты на Рисунок 6-5.

Рисунок 6-5


Результат вывода сочетания PowerShell/Python (для краткости вывод усечён)

Наш вывод разбит на три раздела:

Расздел 1: Это вырабатываемый CmdLet Write-Host вывод внутри нашего сценарий PowerShell.

Расзделы 2-3: Это результаты, вырабатываемые сценарием Python обрабатывающим BookOne.txt. Этот вывод повторяется обработкой BookTwo.txt, поскольку PowerShell обходит в цикле все те текстовые файлы, которые он находит в предписанном каталоге.

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

Подобное сочетание составляет некую модель базового уровня, которая затем может дублироваться для дополнительных результатов. Кроме того, добавляя в вашем сценарии PowerShell последующие Invoke-Command, вы можете собирать файлы и содержимое файлов по всей своей корпорации. Теперь давайте рассмотрим некий иной подход, который передаёт какой- то список названий файлов в сам сценарий Python вместо того чтобы передавать собственно содержимое этих файлов.

Выделение данных EXIF из фотографий

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

Сценарий PoerShell

Наш сценарий PowerShell на Рисунке 6-6 разбит на четыре общих элемента с небольшим переплетением.

Определение локальной переменной $Python с установленным полным путём к самому выбранному вами исполняемому файлу интерпретатора Python. Для днного примера мы снова будем применять Python 3.x.

Задание некой локальной переменной $Script, которая определяет значение полного пути к тому сценарию Python, который будет исполняться.

Установление локальной переменной $fles, которая хранит набор файлов, соответствующих критерию поиска *.jpg. Значение локальной переменной $jpegList вычленяет полный путь к каждому из файлов и исключает заголовки, оставляя лишь список файлов, который мы намерены обработать.

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

Рисунок 6-6


Сценарий PowerShell PhotoMap.ps1

Петли Powershell ForEach: дверь в расширенную обработку данных

ForEach — это псевдоним ForEach-Object. (Псевдоним — это просто ярлык для команды в PowerShell.) Сейчас самое время поговорить о том, как PowerShell обрабатывает данные.

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

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

В PowerShell вы проходите массив и выполняете действие для каждого из них, используя ForEach. Это сэкономит вам несколько строк кода, что полезно, если у вас есть более длинный скрипт. Например, ниже приведен небольшой скрипт, который будет использовать пару циклов Powershell ForEach. Он создает ZIP-архив всех ваших файлов, которые вы не открывали в течение 30 дней.

Читайте так же:
Ук стандарт замена счетчиков

Как проверить остаток циклов батареи на macOS

Для просмотра счетчика циклов батареи на MacBook выполняем следующие действия:

  • в меню Apple в углу слева выбираем «Об этом Mac»;
  • в открывшемся окне нажимаем «Системный отчет» для получения информации;
  • в разделе «Оборудование» выбираем «Питание»;
  • открываем «Информация о состоянии», в появившемся окне находим «Счетчик циклов» с указанием их количества на данный момент.

macOS Battary

macOS также отображает здесь рекомендации: если батарея еще имеет ресурс, будет указано «Нормальный», если ресурс почти исчерпан, отобразится “Рекомендуется сервис».

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

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

Циклы Powershell

Циклы необходимы для повторного выполнения одинаковых операций с использованием разных значений. Есть циклы обрабатывающие данные получаемые из конвейера (ForEach-Object) и работающие отдельно (ForEach). Рассмотрим все возможные циклы Powershell подробнее.

ForEach

Цикл ForEach служит для пошаговой переборки значений из коллекции элементов. Обычно при помощи цикла foreach перебирают элементы в массиве. ForEach является самым простым для понимания и чаще всего используемым циклом в Powershell. ForEach не работает с конвейером для этого есть ForEach-Object. Посмотрим на синтаксис ForEach.

Переменная $collection это массив определенный заранее. Переменная $item — это текущий элемент из $collection. По очереди перебираются все элементы из массива $collection. Далее в фигурных скобках обычно вызывают переменную $item обращаясь к текущему элементу коллекции. Перейдем к примерам. Рассмотрим простейший сценарий по удалению старых журналов сервера IIS.

В переменной $data я вычисляю текущую дату минус 10 дней. В $massiv указываю путь к логам C:script и фильтрую список файлов с датой последней записи позже 10 дней от текущей даты. Далее в цикле foreach удаляю каждый файл из переменной $massiv. Скрипт довольно простой но в тоже время полезный.

Рассмотрим пример попроще. Создадим переменную с массивом чисел и в цикле к каждому числу прибавим 10.

После прохода цикла foreach к каждому числу в массиве $test прибавится 10.

Циклы Powershell foreach являются самыми распространенными.

ForEach-Object

Цикл ForEach-Object выполняет операцию над каждым элементом в коллекции входных объектов. Входные объекты передаются командлету ForEach-Object по конвейеру или могут быть заданы с помощью параметра InputObject. Цикл ForEach-Object поддерживает блоки begin, process, и end используемые в функциях.

Существует три способа построения команд в ForEach-Object. Давайте их перечислим.

Блок сценария

Блок сценария (Script block) — для задания операции используется блок скриптов. С помощью переменной [H1toH2]
подставляется текущий объект. Блок сценария может содержать любой сценарий PowerShell. Рассмотрим пример с получением списка запущенных процессов.

Блоки сценария выполняются в области действия вызывающего объекта. Т.е. блоки имеют доступ к переменным в этой области и могут создавать новые переменные, которые сохраняются после завершения командлета.

Оператор выражения

Оператор выражения (Operation statement) — в данном случае вы можете использовать оператор сразу указывая значение свойства. Данный способ написания визуально более удобен и проще читается. Эта особенность впервые появилась в Windows PowerShell 3.0. Рассмотрим на примере все того же Get-Process

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

Сегодня мне поступила задачка, по списку имен сотрудников (список в текстовом файле) вывести соответствующие почтовые адреса из Microsoft Exchange. Делается это одной строкой как раз с использованием ForeEach-Object.

Читайте так же:
Техснаб тор счетчик жидкости

На входе у меня список сотрудников в текстовом файле sotr.txt. Считанную информацию из файла передаю по конвейеру циклу ForeEach-Object. В цикле командлет Get-Mailbox поочередно для каждого сотрудника из файла считывает информацию и на выходе командлет ft (алиас Format-Table) выводит таблицу с данными: ФИОEMAIL

Блок сценария (параллельный запуск)

Блок сценария (параллельный запуск) — это новая функция доступна с версии Windows Powershell 7.0 позволяет запускать блоки сценария параллельно. Используя параметр ThrottleLimit можно ограничить количество одновременно работающих скриптов. В данном случае как и раньше используется переменная
для подстановки текущего входного объекта. Используйте $using для передачи ссылок на переменные в запущенный скрипт.

В Microsoft Windows PowerShell 7 для каждой итерации цикла создается новое пространство выполнения, обеспечивающее максимальную изоляцию. В связи с этом нужно четко понимать что объем обрабатываемых данных не займет все ресурсы системы. Если объем данных по циклу большой используйте ThrottleLimit. Это позволит ограничить нагрузку на систему и сохранить работоспособность других сервисов. Благодаря параллельному запуску сценарий будет отрабатываться значительно быстрее.

Давайте посмотрим на тестовый скрипт с использованием параллельного запуска.

Я получаю список всех файлов и передаю их на вход ForEach-Object. Цикл параллельно (10 проходов за раз) проходит по каждому файлу и в случае превышения размера более 100 байт записывает его в файл. Это создает хорошую нагрузку на систему. Давайте посмотрим разницу в загруженных ресурсах.

Скрипт отработал 1 минуту и за это время при параллельной обработке памяти затрачено 1 ГБ против 118 Мб при последовательной. Это практически в 10 раз больше. Стоит ли скорость отработки затраченным ресурсам решать вам.

While

Цикл While — это языковая конструкция выполняющая команды в командном блоке, пока условие верно. While довольно прост в написании, давайте посмотрим на синтаксис.

Вначале While оценивает условие в круглых скобках, если оно верно (True) следует выполнение блока команд в фигурных скобках. После первого прохода снова происходит проверка условия и так бесконечно (если его не прервать операторами выхода). Цикл While завершает свою работу если условие становится не верным (False).

Возьмем простейший пример. Введем новую переменную $a и присвоим ей значение 1. Далее цикл while будет проверять значение $a и пока оно не будет равно 10 выполняется блок команд. В блоке к $a будет прибавляться 1 с каждым проходом цикла. В момент когда $a станет равно 10 цикл остановится.

Можно записать цикл и одной строкой, однако читать уже не так удобно

В данном случае я не задал переменную $a и изначально она пустая. Но с каждой итерацией цикла к ней прибавляется 1.

Еще один пример, пригодится в жизни. Напишем сценарий постоянно проверяющий запущен ли процесс. Если процесс запущен то ничего не делать, если не запущен то запустить.

В данном случае while проверяет $a=1, если да то выполнить набор команд. Но $a у меня всегда 1 поэтому цикл будет бесконечный. Это простой пример скрипта для контроля запущенного процесса.

Do работает с циклом While или Until для использования операторов в блоке скрипта в зависимости от условия. Разница между While и Do-While в том, что блок скрипта в цикле Do всегда выполняется как минимум один раз.

В цикле Do-While условие вычисляется после выполнения блока скрипта. Так же как в While блок скрипта повторяется до тех пор, пока условие оценивается как верное.

Цикл Do-Until выполняется минимум один раз перед вычислением условия. Однако блок скрипта запускается когда условие ложно. Когда условие станет верным цикл Do-Until завершит работу.

Данный скрипт проверяет запущен ли блокнот. Если не запущен выполняется условие в фигурных скобках после Do. Цикл выполняется до тех пор пока блокнот не запустят.

Continue и Break

Операторы Continue и Break работают со всеми типами циклов, кроме ForEach-Object. Они могут работать с метками. Метка — имя которое можно присвоить оператору. Формат задания меток :metka цикл(условие) <блок скрипта>.

Оператор Continue предоставляет возможность выхода из текущего блока управления. После выхода из блока цикл продолжит выполнение. В момент вызова Continue текущая итерация цикла завершается и цикл продолжится со следующей итерацией.

Рассмотрим на примере цикла While. Командлет Get-Process ищет запущенные процессы notepad. Если запущен один процесс notepad то сработает Continue и цикл продолжится со следующей итерацией. Когда запущено более 1 процесса notepad все процессы с данным именем будут закрыты.

Оператор Break позволяет выйти из текущего блока управления. Выполнение продолжается на следующем операторе после блока управления. Данный оператор очень удобен если необходимо выйти из постоянно повторяющегося цикла.

Рассмотрим пример с постоянно повторяющимся циклом, остановить который сможет только запуск процесса notepad

Операторы Continue и Break отлично дополняют циклы Powershell еще больше расширяя их возможности.

Цикл For — обычно используется для создания цикла, выполняющего команды в командном блоке пока указанное условие оценивается как верное ($True).

Рассмотрим простейший пример цикла for

В цикле я задаю переменной z значение 2. Блок команд в фигурных скобка выполняется по $z меньше или равно 20.

В данной статье я рассмотрел все циклы Powershell существующие на данный момент. Какие из них использовать в работе конечно же решать вам. До новых встреч

П.С.: задать вопросы, пообщаться, обсудить статью циклы Powershell можно у меня в VK.

[/H1toH2]

Python с нуля — часть 5: циклы – цикл while

Цикл while в Python будет выполнять заданное выражение или блок кода до тех пор, пока заданное условие будет считаться истиной (true).

Синтаксис

Синтаксис цикла while в Python такой:

Тут действие(я) могут быть либо одним выражением, или набором выражений – блоком кода. Условие можно быть любым выражением, а условие будет считаться истиной (true), если результат не равен нулю или не пустой. Цикл будет выполняться пока условие будет считаться истиной.

Когда условие будет считаться как ложь (false) – программа передаст выполнение следующему после цикла участку кода.

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

python_while_loop

Ключевым моментом цикла while является то, что он может вообще не быть запущен при выполнении программы. Если выражение проверено и его результат – ложь, то всё тело цикла будет пропущено, и будет выполнено следующее после цикла выражение.

Пример

Бесконечный цикл while

Цикл становится бесконечным если условие никогда не станет ложью – поэтому вы должны относиться с вниманием к циклам, в которых используется while . Такие циклы называются “бесконечным циклом”.

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

Будучи запущенным, такой код приведёт к такому результату:

В этом примере будет выполняться бесконечный цикл, пока вы не нажмёте комбинацию Ctrl+C, что бы прервать выполнение программы.

Использование оператора else с циклом while

В Python допустимо использование оператора else , связанного с циклом:

  • если оператор else используется с циклом for – он будет выполнен, когда список для цикла будет завершен;
  • при использовании else вместе с циклом while – он будет использован, когда условие примет значение ложь (false).

В следующем примере демонстрирует ся использование оператора else с циклом while , который выводит сообщение до тех пор, пока счётчик меньше 5, после чего будет выполнение действие оператора else :

Результат его выполнения:

Цикл while с одним выражением

По аналогии с оператором if – если цикл while содержит единственное действие, то оно может быть помещено в той же строке:

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector