#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"), ...)