Запустить модуль powershell из python в ubuntu

#python #powershell #ubuntu-20.04

#python #powershell #ubuntu-20.04

Вопрос:

У меня есть PowerShell, установленный в Ubuntu 20.04, и я хочу выполнить следующие шаги из скрипта python:

  • Вызовите его
  • Импортируйте модуль PowerShell
  • Запустите модуль Powershell несколько раз

С терминала я бы сделал это как:

  • pwsh
  • Import-Module ./MyModule.psd1
  • MyModule -param 'param_val' -Quiet > filename несколько раз

Я пытался использовать

 p = subprocess.Popen("pwsh", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True)
time.sleep(2)
p.stdin.write("Import-Module ./MyModule.psd1")
#in loop
p.stdin.write("MyModule -param 'param_val' -Quiet > filename")
  

Который, очевидно, не работает. Я пытался использовать Thread и Queue , но боюсь, что проблема не в этом.
Я был бы чрезвычайно благодарен за любую помощь и предложения.

Комментарии:

1. вы могли бы получить p.stdout.read() и сохранить его с помощью open() , write() , close()

2. что вы имеете в виду под «не работает»? Вы получаете ошибку? Всегда показывайте полное сообщение об ошибке. Вы получаете неправильные данные в файле? Если вы используете > много раз, вы получаете только последние данные. Вам нужно будет >> добавить все данные.

3. @furas, под «не работает» я подразумеваю, что файл не создан. Это работает с терминала. Да, имя файла отличается для каждой итерации.

4. У меня нет pwsh и я тестировал с bash . Мне пришлось пропустить universal_newlines=True и преобразовать каждую команду в bytest — "commad'.encode() . Для каждой команды требовалась новая строка n в конце (например, нажатие Enter при обычном использовании) — "commandn".encode() . Поскольку он использует буфер, поэтому мне пришлось принудительно отправить его p.stdin.flush() . Иногда для его выполнения требовалось короткое время, поэтому мне нужно time.sleep(0.2)

5. Я тестировал также без > filename , но с: with open("filename", "w") as fh: fh.write( p.stdin.read() ) И если я хотел бы записать все в один файл, то Popen(..., stdout=open("filename","w"), ...)