#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() закрывает открытый проводник.