Рассмотрим простой метод интеграции 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
А что вы думаете по этому поводу?