Python

Проблема PowerShell на Python

Нужна помощь, не получается работать с powershell на пайтоне. Вот код:
 import subprocess 

def execute_powershell_script(script):
completed_process = subprocess.run(['powershell', '-command', script], stdout=subprocess.PIPE, text=True)
return completed_process.stdout

while True:
command = input("Введите команду PowerShell: ")

# Записать команду во временный скрипт
script = f"{command}\n Get-Location"

# Выполнить скрипт и получить результат
result = execute_powershell_script(script)
print(result)
Я выполняю команду ls и смотрю что нахожусь в директории D:\project\test дальше выполняю cd / и вижу что нахожусь теперь в D:\ но если снова посмотреть на ls то она возвращает на изначальную директорию D:\project\test каждая новая команда начинается с изначальной директории. Как решить эту проблему? Мне нужно перемещаться по директориям и просматривать содержимое а у меня постоянно с изначальной папки начинает

Мучал chatGPT и он выдает: Понял, в этом случае проблема связана с тем, что каждая команда subprocess.run () выполняется в отдельном процессе, и изменения рабочей директории, сделанные в одной команде, не сохраняются для других команд. НО КАК РЕШИТЬ? НЕ ПОЛУЧАЕТСЯ
Проблема заключается в том, что каждая из ваших команд PowerShell выполняется в новой сессии шелл, и поэтому они не сохраняют состояние между исполнениями. Когда вы переходите в другую директорию с командой cd, эта директория остается активной только в течение текущей сессии, и не сохраняется при следующем запуске скрипта.

Вместо выполнения команд в виде отдельных скриптов, вы можете управлять сессией PowerShell непосредственно через подпроцесс Python. Вот пример такого кода:
 import subprocess 

# Создать экземпляр PowerShell
ps = subprocess.Popen(['powershell'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
text=True)

# Отправить команду PowerShell
ps.stdin.write('cd D:\\project\\test\n')
ps.stdin.write('Get-Location\n')
ps.stdin.flush()

# Получить вывод
print(ps.stdout.read())

# Закрыть сессию PowerShell
ps.stdin.close()
ps.terminate()
Виталий Туксанаев
Виталий Туксанаев
25 860
Лучший ответ
Я Рисую Осень Не работает этот код. Он запускается и все на этом зависает. возможно из за не закрываете стандартный ввод (stdin) процесса PowerShell, после того как записали в него команды. Это может вызвать блокировку процесса, так как он ожидает дополнительных данных, которые не поступают.
Я Рисую Осень вот так работает но как теперь ему постоянно отправлять команды и что бы он не терял связь. цикл поставить или просто input
 import subprocess 

# Создать экземпляр PowerShell
ps = subprocess.Popen(['powershell'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
text=True)

# Отправить команду PowerShell
ps.stdin.write('ls\n')
ps.stdin.write('cd /\n')
ps.stdin.write('ls\n')
ps.stdin.flush()

# Закрыть стандартный ввод
ps.stdin.close()

# Получить вывод
output, errors = ps.communicate()

# Вывести результат
print(output)

# Закрыть сессию PowerShell
ps.terminate()
Виталий Туксанаев Этот код создает экземпляр PowerShell и затем в цикле while запрашивает у пользователя команду, отправляет ее в PowerShell и выводит результат. Цикл будет продолжаться до тех пор, пока вы не прервете его (например, нажав Ctrl+C). Вы можете модифицировать этот код в соответствии с вашими требованиями.
Проблема в том, что вы не сохраняете текущую директорию перед выполнением команды cd /. Чтобы сохранять текущую директорию и восстанавливать ее после выполнения команды cd, можно использовать модуль os:

import os
import subprocess


def execute_powershell_script(command, directory=None):
completed_process = subprocess.run (
['powershell', f"-Command {command}"],
stdout=subprocess.PIPE,
text=True,
cwd=directory,
)
return completed_process


# Записываем команду во временный скрипт, добавляем сохранение текущей директории
command = input(f"Введите команду PowerShell (с сохранением текущей директории): ")
script = f"{command}\t{os.getcwd()}\n Get-Location\n"

# Выполняем скрипт и получаем результат
result = execute_powershell_script(script, os.getcwd())
print(result)
Hulk*** Avenger***
Hulk*** Avenger***
40 871
Я Рисую Осень команда ls выводит нам
  CompletedProcess(args=['powershell', '-Command ls\tD:\\project\\kichinekei_balapan\n Get-Location\n'], returncode=0, stdout='-Command : €¬п "-Command" \xadҐ а\xa0бЇ®§\xad\xa0\xad® Є\xa0Є Ё¬п Є®¬\xa0\xad¤«Ґв\xa0, дг\xadЄжЁЁ, д\xa0©«\xa0 бжҐ\xad\xa0аЁп Ё«Ё ўлЇ®«\xad塞®© Їа®Ја\xa0¬¬л. Џа®ўҐам⥠Їа\xa0ўЁ«м\xad®бвм \n\xad\xa0ЇЁб\xa0\xadЁп Ё¬Ґ\xadЁ, \xa0 в\xa0Є¦Ґ \xad\xa0«ЁзЁҐ Ё Їа\xa0ўЁ«м\xad®бвм ЇгвЁ, Ї®б«Ґ 祣® Ї®ўв®аЁвҐ Ї®ЇлвЄг.\nбва®Є\xa0:1 §\xad\xa0Є:1\n+ -Command ls    D:\\project\\kichinekei_balapan\n+ ~~~~~~~~\n    + CategoryInfo          : ObjectNotFound: (-Command:String) [], CommandNotFoundException\n    + FullyQualifiedErrorId : CommandNotFoundException\n \n\nPath                         \n----                         \nD:\\project\\kichinekei_balapan\n\n\n') 
Я Рисую Осень CompletedProcess(args=['powershell', '-Command ls\tD:\\project\\kichinekei_balapan\n Get-Location\n'], returncode=0, stdout='-Command : €¬п "-Command" \xadҐ а\xa0бЇ®§\xad\xa0\xad® Є\xa0Є Ё¬п Є®¬\xa0\xad¤«Ґв\xa0, дг\xadЄжЁЁ, д\xa0©«\xa0 бжҐ\xad\xa0аЁп Ё«Ё ўлЇ®«\xad塞®© Їа®Ја\xa0¬¬л. Џа®ўҐам⥠Їа\xa0ўЁ«м\xad®бвм \n\xad\xa0ЇЁб\xa0\xadЁп Ё¬Ґ\xadЁ, \xa0 в\xa0Є¦Ґ \xad\xa0«ЁзЁҐ Ё Їа\xa0ўЁ«м\xad®бвм ЇгвЁ, Ї®б«Ґ 祣® Ї®ўв®аЁвҐ Ї®ЇлвЄг.\nбва®Є\xa0:1 §\xad\xa0Є:1\n+ -Command ls D:\\project\\kichinekei_balapan\n+ ~~~~~~~~\n + CategoryInfo : ObjectNotFound: (-Command:String) [], CommandNotFoundException\n + FullyQualifiedErrorId : CommandNotFoundException\n \n\nPath \n---- \nD:\\project\\kichinekei_balapan\n\n\n')
Я Рисую Осень команда ls выводит нам
CompletedProcess(args=['powershell', '-Command ls\tD:\\project\\kichinekei_balapan\n Get-Location\n'], returncode=0, stdout='-Command : €¬п "-Command" \xadҐ а\xa0бЇ®§\xad\xa0\xad® Є\xa0Є Ё¬п Є®¬\xa0\xad¤«Ґв\xa0, дг\xadЄжЁЁ, д\xa0©«\xa0 бжҐ\xad\xa0аЁп Ё«Ё ўлЇ®«\xad塞®© Їа®Ја\xa0¬¬л. Џа®ўҐам⥠Їа\xa0ўЁ«м\xad®бвм \n\xad\xa0ЇЁб\xa0\xadЁп Ё¬Ґ\xadЁ, \xa0 в\xa0Є¦Ґ \xad\xa0«ЁзЁҐ Ё Їа\xa0ўЁ«м\xad®бвм ЇгвЁ, Ї®б«Ґ 祣® Ї®ўв®аЁвҐ Ї®ЇлвЄг.\nбва®Є\xa0:1 §\xad\xa0Є:1\n+ -Command ls D:\\project\\kichinekei_balapan\n+ ~~~~~~~~\n + CategoryInfo : ObjectNotFound: (-Command:String) [], CommandNotFoundException\n + FullyQualifiedErrorId : CommandNotFoundException\n \n\nPath \n---- \nD:\\project\\kichinekei_balapan\n\n\n')
можно взять, что насоветовали выше, но print зациклить, в отдельном потоке.
а команды вводить в основном потоке. только надо будет еще паузу делать перед вводом чтобы успело все распечатать с предыдущей команды