Как закрыть экземпляр проводника с помощью Python?
Каждый раз когда я сажусь за изучение Python, я открываю определенное кол-во программ и файлов которые мне понадобятся при обучении и это делать не удобно. Открыть Notepad++, затем CMD, затем проводник, в проводнике открыть QTTabBar закладку, открыть книгу, так что решил реализовать это все, через инструменты что доступны в Python, но столкнулся с проблемой (код привел ниже), скрипт грубый и примитивный но это пока что, для закрытия программ пользуюсь методом os.system и "Убийцей процессов" taskkill, проблема в том, что при закрытие обычных программ не возникает проблем, так как требуется просто ввести имя процесса который хочешь остановить, но процесс проводника explorer.exe существует не в одном экземпляре, и процесс explorer.exe что отвечает за открытые папки и процесс explorer.exe который отвечает за меню пуска и прочего ни чем не отличаются, и как то явно указать на то, что мне необходимо закрыть определенный процесс explorer.exe не получается, подскажите пожалуйста как это сделать лучше всего
# Файл №1 - открывает все нужные приложения
import subprocess
import time
subprocess.Popen('explorer "D:\"')
subprocess.Popen('D:\\Program\\ShareX\\ShareX.exe')
time.sleep(1)
subprocess.Popen(('start','D:\\Miscellanea\\Programmig\\Programming-Python\\Книги\\Укус_Питона.pdf'),shell = True)
subprocess.Popen('D:\\Program\\Notepad++\\notepad++.exe')
# Файл №2 - закрывает все нужные приложения
import os
os.system('taskkill /pid ShareX.exe')
os.system('taskkill /pid PDFXCview.exe')
os.system('taskkill /pid notepad++.exe')
Ответы (3 шт):
В современных версиях Windows explorer не создает отдельных процессов под каждое открытое окно. Чтобы заставить его сделать отдельный процесс, нужно вызвать его с параметром /separate. Однако этот параметр несовместим с заданием папки в качестве второго параметра. Таким образом, стандартный набор из taskkill и explorer не позволяет это делать.
А вот nircmd позволяет. Он закрывает окно по его заголовку, неважно, explorer это или нет:
nircmd win close title "Заголовок окна"
Например, у меня при открытии диска С: в explorer заголовок окна "SYSTEM (C:)" - с указанием метки тома. Поэтому я пишу:
nircmd win close title "SYSTEM (C:)"
И именно это окно закрывается.
Скачать nircmd можно на сайте автора: https://www.nirsoft.net/utils/nircmd.html
Перечитал вопрос, в вашем случае всё проще:
p = subprocess.Popen("explorer.exe D:")
p.kill() # Или p.terminate()
Способ для двух скриптов:
import subprocess
import time
kill_list = []
p = subprocess.Popen("galculator")
kill_list.append(p.pid)
# Сериализуешь kill_list, десериализуешь в другом скрипте
print(kill_list)
time.sleep(2)
import os
import signal
for pid in kill_list:
os.kill(pid, signal.SIGTERM)
import psutil
def kill_last_proc(proc_name):
last = None
for proc in psutil.process_iter():
if proc.name() != proc_name:
continue
if last is None or proc.create_time() > last.create_time():
last = proc
if last is not None:
last.kill()
kill_last_proc('explorer.exe')
При желании можно попробовать выцепить не последний запущенный, а, скажем, проанализировать список открытых файлов)
Как-то так
# pip install pywin32
import win32gui
import win32con
window_title = "SYSTEM (C:)"
# Получаем хэндл окна
hwnd = win32gui.FindWindow(None, window_title)
if hwnd:
# Отправляем сообщение WM_CLOSE
win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
else:
print("Окно не найдено")