Я сталкиваюсь с проблемой, в которой запуск PowerShell через подпроцесс Python.popen () работает, как и ожидалось во время обычного выполнения, но в режиме отладки (с использованием переменных среды Demaugpy/Cursor) (например, Programfiles и LocalAppdata ). Напротив, когда я запускаю команду CMD (например, Echo %Programfiles %), переменные среды правильно наследуют. /> < /ul>
Что я проверил < /h3>
Я создал небольшую программу испытаний с тремя функциями: одна для PowerShell с опцией -noprofile < /code> (
Код: Выделить всё
print_psh
Код: Выделить всё
print_psh_with_profile
Код: Выделить всё
print_cmd
Код: Выделить всё
print_psh_with_profile_inject_env
Код: Выделить всё
import subprocess
import os
def print_psh(cmd):
with subprocess.Popen(
"powershell -NoProfile " + '"' +
f"$ErrorActionPreference='silentlycontinue'; $tmp = ({cmd}); if ($tmp){{echo $tmp; Exit;}}" + '"',
stdout=subprocess.PIPE,
stdin=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
shell=True,
) as stream:
cmm = stream.communicate()
stdout = cmm[0].decode()
print(f"NoProfile: {cmd} = {stdout}")
def print_psh_with_profile(cmd):
with subprocess.Popen(
"powershell " + '"' +
f"$ErrorActionPreference='silentlycontinue'; $tmp = ({cmd}); if ($tmp){{echo $tmp; Exit;}}" + '"',
stdout=subprocess.PIPE,
stdin=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
shell=True,
) as stream:
cmm = stream.communicate()
stdout = cmm[0].decode()
print(f"WithProfile: {cmd} = {stdout}")
def print_psh_with_profile_inject_env(cmd):
with subprocess.Popen(
"powershell " + '"' +
f"$ErrorActionPreference='silentlycontinue'; $tmp = ({cmd}); if ($tmp){{echo $tmp; Exit;}}" + '"',
stdout=subprocess.PIPE,
stdin=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
shell=True,
env=os.environ.copy(),
) as stream:
cmm = stream.communicate()
stdout = cmm[0].decode()
print(f"WithProfile(inject env): {cmd} = {stdout}")
def print_cmd(cmd):
with subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stdin=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
shell=True,
) as stream:
cmm = stream.communicate()
stdout = cmm[0].decode()
print(f"CMD.EXE: {cmd} = {stdout}")
print_psh("Write-Host $env:PROGRAMFILES")
print_psh("Write-Host $env:LOCALAPPDATA")
print_cmd("echo %PROGRAMFILES%")
print_cmd("echo %LOCALAPPDATA%")
print_psh_with_profile("Write-Host $env:PROGRAMFILES")
print_psh_with_profile("Write-Host $env:LOCALAPPDATA")
print_psh_with_profile_inject_env("Write-Host $env:PROGRAMFILES")
print_psh_with_profile_inject_env("Write-Host $env:LOCALAPPDATA")
< /code>
output < /h3>
нормальное выполнение (режим не-дебуг): < /h4>
NoProfile: Write-Host $env:PROGRAMFILES = C:\Program Files
NoProfile: Write-Host $env:LOCALAPPDATA = C:\Users\(USERNAME)\AppData\Local
CMD.EXE: echo %PROGRAMFILES% = C:\Program Files
CMD.EXE: echo %LOCALAPPDATA% = C:\Users\(USERNAME)\AppData\Local
WithProfile: Write-Host $env:PROGRAMFILES = [profile script output] ... C:\Program Files
WithProfile: Write-Host $env:LOCALAPPDATA = [profile script output] ... C:\Users\(USERNAME)\AppData\Local
WithProfile(inject env): Write-Host $env:PROGRAMFILES = C:\Program Files
WithProfile(inject env): Write-Host $env:LOCALAPPDATA = C:\Users\(USERNAME)\AppData\Local
< /code>
режим отладки (с помощью Debugpy): < /h4>
NoProfile: Write-Host $env:PROGRAMFILES =
NoProfile: Write-Host $env:LOCALAPPDATA =
CMD.EXE: echo %PROGRAMFILES% = C:\Program Files
CMD.EXE: echo %LOCALAPPDATA% = C:\Users\(USERNAME)\AppData\Local
WithProfile: Write-Host $env:PROGRAMFILES =
WithProfile: Write-Host $env:LOCALAPPDATA =
WithProfile(inject env): Write-Host $env:PROGRAMFILES =
WithProfile(inject env): Write-Host $env:LOCALAPPDATA =
< /code>
Что я попробовал < /h3>
[*] Удаление -noprofile < /code> не изменил результат в режиме отладки. (через Echo %Programfiles %< /code>), переменные среды правильно унаследованы. в то время как CMD -подпроцессы наследуют среду нормально. (например, в запуске.json), чтобы гарантировать, что полная среда передается PowerShell даже в режиме отладки? webdriver_manager
, чтобы понять, почему это не удалось только в режиме отладки, я проследил сбором Call и нашел, что он в конечном итоге достигает подпрограммы. PowerShell. Это заставило меня проверить минимальные воспроизводимые примеры с использованием Popen непосредственно, когда я обнаружил, что в разделе Debugpy переменные среды, ожидаемые PowerShell, необъяснимым образом отсутствуют, в то время как один и тот же код ведет себя правильно вне режима отладки или при вызове CMD
. Следовательно, ShapeLish STIMSHELSHELSHELSHELSHELSHELSHELSHELSHELSHELSHELESHELSELSELSELSELESE SEPLIS запущен в среде, в которой отсутствуют основные переменные, такие как ProgramFiles или localappdata .
Enviorment (редактор)
cursor 0.48.9
[*] vscode 1.96.2
Git Graph v3 < /li>
Git Lens < /li>
Языковой пакет < /li>
pylance < /li>
python < /li>
debugger < /li>
< /br /li>
>
Подробнее здесь: https://stackoverflow.com/questions/795 ... -variables