Python в Windows — проблема с получением правильного идентификатора процесса при программном открытии проводника

#python #windows #subprocess #pid #explorer

#python #Windows #подпроцесс #pid #проводник

Вопрос:

Мне нужно программно открыть окно проводника файлов и сохранить pid процесса, чтобы использовать его позже для закрытия окна проводника файлов

 import os, subprocess

#Open file explorer
p = subprocess.Popen(['explorer.exe'])

#Close file explorer
os.kill(p.pid, signal.SIGTERM)
  

При выполнении этого я получаю сообщение об ошибке PermissionError: [WinError 5] Access is denied
Также при проверке в диспетчере задач я не вижу ни одного процесса, запущенного со значением pid p.pid

Тот же код отлично работает при попытке с другим exe.

 import os, subprocess

#Open file explorer
p = subprocess.Popen(['notepad.exe'])

#Close file explorer
os.kill(p.pid, signal.SIGTERM)
  

И на этот раз я вижу notepad.exe выполняется с pid, как показано p.pid

Проблема, похоже, связана с выполнением explorer.exe . Может кто-нибудь пролить свет на то, что особенного в explorer.exe в windows.

Нет. раз explorer.exe выполняется не пропорционально количеству процессов, отображаемых в диспетчере задач

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

1. Запуск программы может активировать уже запущенный экземпляр, а затем завершить работу, как это часто бывает с explorer.exe . Просто потому, что вы видите новое окно, это не означает, что окно принадлежит процессу, который вы создали. Используйте p.send_signal(signal.SIGTERM) , который в Windows вызывает p.terminate() , который вызывает _winapi.TerminateProcess(p._handle, 1) . Это внутренне обрабатывает PermissionError , если процесс уже завершен. ( p._handle является надежным дескриптором для объекта процесса ядра. PID не является, хотя в современных версиях Windows лучше не использовать PID повторно.)

2. Хотя p.send_signal(сигнал. SIGTERM) не помогает полностью решить эту проблему, по крайней мере, не выдает ошибку разрешения. Ни один из этих p.terminate() , p.kill() , p._handle . Close() закрывает открытый проводник.