PowerShell Subprocess, запущенный через Debugpy, не наследует переменные среды (но cmd.exe делает)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 PowerShell Subprocess, запущенный через Debugpy, не наследует переменные среды (но cmd.exe делает)

Сообщение Anonymous »

Проблема
Я сталкиваюсь с проблемой, в которой запуск PowerShell через подпроцесс Python.popen () работает, как и ожидалось во время обычного выполнения, но в режиме отладки (с использованием переменных среды Demaugpy/Cursor) (например, Programfiles и LocalAppdata ). Напротив, когда я запускаю команду CMD (например, Echo %Programfiles %), переменные среды правильно наследуют. /> < /ul>

Что я проверил < /h3>
Я создал небольшую программу испытаний с тремя функциями: одна для PowerShell с опцией -noprofile < /code> (

Код: Выделить всё

print_psh
), один для PowerShell без этой опции (

Код: Выделить всё

print_psh_with_profile
) и один для CMD (

Код: Выделить всё

print_cmd
). Я также сделал вариант (

Код: Выделить всё

print_psh_with_profile_inject_env
) где я передаю env = os.environ.copy () явно.

Код: Выделить всё

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 
для автоматической загрузки и запуска совместимой версии Chromedriver в сценарии, запущенном под Debugpy. Я заметил, что webdriver_manager не смог обнаружить установленную версию Chrome в моей системе. При более внимательном рассмотрении я обнаружил, что он внутренне пытается получить версию Chrome с использованием команд PowerShell (например, доступ к ключам реестра или путям файлов, которые полагаются на переменные среды, такие как Programfiles ).
, чтобы понять, почему это не удалось только в режиме отладки, я проследил сбором 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • PowerShell Subprocess, запущенный через Debugpy, не наследует переменные среды (но cmd.exe делает)
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • PowerShell Subprocess, запущенный через Debugpy, не наследует переменные среды (но cmd.exe делает)
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • A.exe, запущенный из cmd, не видит входные файлы
    Anonymous » » в форуме C++
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • A.exe, запущенный из cmd, не видит входные файлы
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • A.exe, запущенный из cmd, не видит входные файлы
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»