А АTuesday 1 October 2024

Запуск PowerShell из Python.

Всем привет.

Рассмотрим простой метод интеграции Python и PowerShell.

Самое простое выглядит так что если бы мы смогли исполнять CmdLet PowerShell из Python и перехватывать результаты. Так как PowerShell является неким исполняемым процессом, тем самым мы можем применять стандартную библиотеку Python, предоставляющую возможность запуска поцессов. Это делается с применением стандартной библиотеки subprocess. В Python для применения любой стандартной или сторонней библиотеки вам следует импортировать её. В данном случае это просто:

import subprocess 

Это предоставляет доступ к методам и свойствам, содержащимся в данной библиотеке subprocess. Доступно монжество вариантов - наиболее популярным является применение метода check.output, который исполняет предписанный процесс и возвращает полученный результат. Вот некий пример:

runningProcesses = subprocess.check_output("powershell -Executionpolicy ByPass -Command Get-Process") 

Существует также аналог асинхронного варианта вызова подчинённого процесса, вызов метода await asyncio.create_subprocess_shell()), подробнее в книгах Asyncio в Python 3 Цалеба Хаттингха и Полном руководстве параллельного программирования на Python Куан Нгуена:

import asyncio

async def run(cmd):

    proc = await asyncio.create_subprocess_shell(cmd, stdout=asyncio.subprocess.PIPE,      stderr=asyncio.subprocess.PIPE

    )

    stdout, stderr = await proc.communicate()

    print(f'[{cmd!r} exited with {proc.returncode}]')

    if stdout:

        print(f'[stdout]\n{stdout.decode()}')

    if stderr:

        print(f'[stderr]\n{stderr.decode()}')

asyncio.run(run('powershell -Executionpolicy ByPass -Command Get-Process'))

Разобъём по частям все элементы кода субпроцессов по мере их следования:


Команды субпроцесса Python:

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

B. Оператор присвоения , или знак равенства (=) назначает полученный результат вашей команды подпроцесса самой переменной runningProcesses.

C. subprocess.check_output выступает выбранным методом из нашей библиотеки subprocess. Он получает единственный параметр, заключаемый в кавычки и определяет ту командную строку, которую вы желаете исполнять.

D. Заключённая в кавычки строка внутри круглых скобок определяет подлежащую исполнению команду. 

E. powershell выступает в роли команды, или в данном случае процесса для выполнения.

F. -Executionpolicy ByPass, по умолчанию, PowerShell не выполняет сценарии или CmdLet без полномочий в явном виде. Указанный параметр -Executionpolicy определяет значение политики для нашей команды PowerShell. Параметр ByPass сообщает PowerShell о том что не следует ничего блокировать и не выпускать никаких предупреждений или приглашений.

G. -Command определяет что следует за командой PowerShell. В данном случае это просто CmdLet, однако это может быть более сложная команда на основе конвейера. Если вы желаете исполнить некий сценарий PowerShell, данный литерал следует заменить на -File с последующим допустимым названием файла .ps1.

H. Get-Process является неким особым CmdLet, который следует исполнить. В данном примере CmdLet Get-Process выполняется без параметров.

В Python 3.x, наш метод subprocess.check_output() возвращает некую строку байт, в то время как в Python 2.7 он возвращает простую строку. Следовательно, для отображения полученного из данной Command вывода, нашу переменную runningProcesses требуется декодировать:

print(runningProcesses.decode()) 

Выполнение данной команды предоставляет результаты, отображаемые на рисунке:


Удачи.

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное