Python, как правильно завершить процесс .exe?
Теперь через определённое время их нужно завершить, например третий профиль, потом пятый, первый и т.д
С этим я так и не разобрался.
Разобрался как убить все процессы firefox.exe:
os.system(«taskkill /im firefox.exe»)
Но при следующем запуске, firefox пишет что не корректно была завершена работа и просит запуститься в безопасном режиме.
При alt+f4 не ругается на некорректное завершение работы.
Вопрос в том как правильно завершить что бы он не ругался?
А ещё лучше как правильно завершить определённый профиль?
- Вопрос задан более двух лет назад
- 3518 просмотров
Комментировать
Решения вопроса 1

Hemul GM @HemulGM Куратор тега Python
Delphi Developer, сис. админ
Отправить сообщение приложению о закрытии через WinAPI
Ответ написан более двух лет назад
Нравится 1 2 комментария
XXocTT Python @XXocTT Автор вопроса
Не совсем пойму как. Гугл особо инфы не даёт, возможно я задаю вопрос не правильно

Hemul GM @HemulGM Куратор тега Python
Пётр Питаев, PostMessage(H, WM_QUIT, 0, 0);
H — Handle приложения (или окна)
PostMessage — это метод WInApi, гугли.
Ответы на вопрос 1

Yupiter7575 @yupiter7575
Python программист
os.system(«taskkill /im firefox.exe»)
Это плохая практика. Намного лучше делать так:
import subprocess as sp sp.Popen('taskkill /im firefox.exe /f')
Если вы запускаете через интерпретатор пайтона, если же у вас упакованный .py файл, то лучше сделать так:
import psutil #pip isntall psutil for proc in psutil.process_iter(): if proc.name() == 'firefox.exe': proc.terminate()
Ответ написан более двух лет назад
XXocTT Python @XXocTT Автор вопроса
Спасибо. Но сожалению я получаю то же самое сообщение
выдает такую ошибку при установку psutil
ERROR: Command errored out with exit status 1:
command: ‘C:\Users\Arsen\AppData\Local\Programs\Python\Python310\python.exe’ -u -c ‘import io, os, sys, setuptools, tokenize; sys.argv[0] = ‘»‘»‘C:\\Temp\\pip-install-aavmpc3x\\psutil_e1ba7405a9f34bbd9d19b1fce718f1c1\\setup.py'»‘»‘; __file__='»‘»‘C:\\Temp\\pip-install-aavmpc3x\\psutil_e1ba7405a9f34bbd9d19b1fce718f1c1\\setup.py'»‘»‘;f = getattr(tokenize, ‘»‘»‘open'»‘»‘, open)(__file__) if os.path.exists(__file__) else io.StringIO(‘»‘»‘from setuptools import setup; setup()'»‘»‘);code = f.read().replace(‘»‘»‘\r\n'»‘»‘, ‘»‘»‘\n'»‘»‘);f.close();exec(compile(code, __file__, ‘»‘»‘exec'»‘»‘))’ install —record ‘C:\Temp\pip-record-k8aafsm2\install-record.txt’ —single-version-externally-managed —compile —install-headers ‘C:\Users\Arsen\AppData\Local\Programs\Python\Python310\Include\psutil’
cwd: C:\Temp\pip-install-aavmpc3x\psutil_e1ba7405a9f34bbd9d19b1fce718f1c1\
Complete output (38 lines):
running install
running build
running build_py
creating build
creating build\lib.win-amd64-3.10
creating build\lib.win-amd64-3.10\psutil
copying psutil\_common.py -> build\lib.win-amd64-3.10\psutil
copying psutil\_compat.py -> build\lib.win-amd64-3.10\psutil
copying psutil\_psaix.py -> build\lib.win-amd64-3.10\psutil
copying psutil\_psbsd.py -> build\lib.win-amd64-3.10\psutil
copying psutil\_pslinux.py -> build\lib.win-amd64-3.10\psutil
copying psutil\_psosx.py -> build\lib.win-amd64-3.10\psutil
copying psutil\_psposix.py -> build\lib.win-amd64-3.10\psutil
copying psutil\_pssunos.py -> build\lib.win-amd64-3.10\psutil
copying psutil\_pswindows.py -> build\lib.win-amd64-3.10\psutil
copying psutil\__init__.py -> build\lib.win-amd64-3.10\psutil
creating build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\runner.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_aix.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_bsd.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_connections.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_contracts.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_linux.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_memleaks.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_misc.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_osx.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_posix.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_process.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_sunos.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_system.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_testutils.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_unicode.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\test_windows.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\__init__.py -> build\lib.win-amd64-3.10\psutil\tests
copying psutil\tests\__main__.py -> build\lib.win-amd64-3.10\psutil\tests
running build_ext
building ‘psutil._psutil_windows’ extension
error: Microsoft Visual C++ 14.0 or greater is required. Get it with «Microsoft C++ Build Tools»: https://visualstudio.microsoft.com/visual-cpp-buil.
—————————————-
ERROR: Command errored out with exit status 1: ‘C:\Users\Arsen\AppData\Local\Programs\Python\Python310\python.exe’ -u -c ‘import io, os, sys, setuptools, tokenize; sys.argv[0] = ‘»‘»‘C:\\Temp\\pip-install-aavmpc3x\\psutil_e1ba7405a9f34bbd9d19b1fce718f1c1\\setup.py'»‘»‘; __file__='»‘»‘C:\\Temp\\pip-install-aavmpc3x\\psutil_e1ba7405a9f34bbd9d19b1fce718f1c1\\setup.py'»‘»‘;f = getattr(tokenize, ‘»‘»‘open'»‘»‘, open)(__file__) if os.path.exists(__file__) else io.StringIO(‘»‘»‘from setuptools import setup; setup()'»‘»‘);code = f.read().replace(‘»‘»‘\r\n'»‘»‘, ‘»‘»‘\n'»‘»‘);f.close();exec(compile(code, __file__, ‘»‘»‘exec'»‘»‘))’ install —record ‘C:\Temp\pip-record-k8aafsm2\install-record.txt’ —single-version-externally-managed —compile —install-headers ‘C:\Users\Arsen\AppData\Local\Programs\Python\Python310\Include\psutil’ Check the logs for full command output.
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Windows
- +3 ещё
Как сделать доступ в Интернет только из виртуальной машины в ноутбуке с Windows 11 через встроенный модем LTE/4G?
- 1 подписчик
- 9 часов назад
- 26 просмотров
Как завершить процесс python multiprocess
у меня есть процесс хочу по его названию( не по PID ) завершить его, как это реализовать?
Отслеживать
задан 2 июн 2021 в 13:17
Артём Новокеков Артём Новокеков
27 3 3 бронзовых знака
Покажите пожалуйста в вопросе, где у вас есть процесс?
2 июн 2021 в 13:50
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
непонятно что имеется виду, если это рукотворный multiprocess процесс, то соответственно есть и его объект, у которого есть имя и метод terminate, берете объект процесса, сравниваете его имя, и при необходимости завершаете через terminate
import multiprocessing, time, random def test(s, m=500): while m > 0: print(f' = ') m -= 1 time.sleep(.5) if __name__ == '__main__': multiprocessing.freeze_support() count = 3 prcss = [multiprocessing.Process(name=f'test_', target=test, args=[f'run_test_']) for r in range(count)] pnames = [p.name for p in prcss] # имена процессов for p in prcss: p.start() while prcss: for p in prcss: name = random.choice(pnames) if p.name == name: # завершить по его названию p.terminate() prcss.remove(p) print(f'KILL ') break time.sleep(1)
если это сторонний процесс, то через psutil
import psutil for proc in psutil.process_iter(): if proc.name() == 'test process': # завершить по его названию proc.kill() break
Как завершить процесс в python?
Добрый день.
Суть в том, что запускаю ffmpeg с помощью subprocess.Popen, и когда завершаю работу скрипта с помощью proc.kill() затем proc.terminate() затем sys.exit() , то ffmpeg продолжает висеть в диспетчере задач, хоть и не активен (т.е в столбике где написано ЦП показывает 0 ). Как убрать его полностью из диспетчера задач?
- Вопрос задан более трёх лет назад
- 8815 просмотров
Комментировать
Решения вопроса 1
WorldEn @WorldEn Автор вопроса
Решил проблему с помощью библиотеки psutil
import psutil parent_pid = 30437 # my example parent = psutil.Process(parent_pid) for child in parent.children(recursive=True): # or parent.children() for recursive=False child.kill() parent.kill()
Ответ написан более трёх лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 1
Вероятно ffmpeg запускает подпроцессы. Убивайте всю группу:
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid) os.killpg(os.getpgid(pro.pid), signal.SIGTERM)
Ответ написан более трёх лет назад
WorldEn @WorldEn Автор вопроса
os.getpgid это для линукса, а у меня винда. Есть аналог этой команды для моей ОС ?))
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Python
- +1 ещё
Как открывать браузер у конкретного пользователя?
- 1 подписчик
- 10 часов назад
- 40 просмотров
Как завершить подпроцесс Python, запущенный с shell = True
Я запускаю подпроцесс следующей командой:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
Однако, когда я пытаюсь его завершить, используя:
p.terminate()
или же:
p.kill()
к оманда продолжает работать в фоновом режиме, поэтому мне было интересно, как я могу завершить процесс.
Обратите внимание, что , когда я запускаю команду с:
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
о н действительно завершается успешно при вызове p.terminate() .
Ответ 1
Используйте группу процессов, чтобы разрешить отправку сигнала всем процессам в группах. Для этого вы должны прикрепить идентификатор сеанса к родительскому процессу порожденных/дочерних процессов, который в вашем случае является оболочкой. Это сделает его лидером группы процессов. Итак, теперь, когда сигнал отправляется лидеру группы процессов, он передается всем дочерним процессам этой группы.
Вот код:
import os
import signal
import subprocess
# Команда os.setsid() передается в аргументе preexec_fn, поэтому.
# она выполняется после fork() и перед exec() для запуска оболочки.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
os.killpg(os.getpgid(pro.pid), signal.SIGTERM) # Отправляет сигнал всем группам процессов
Ответ 2
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
p.kill()
p.kill() заканчивает выполнение и завершает процесс оболочки, но cmd все еще работает.
Я нашел удобное решение:
p = subprocess.Popen(«exec » + cmd, stdout=subprocess.PIPE, shell=True)
Это заставит cmd унаследовать процесс оболочки вместо того, чтобы оболочка запускала дочерний процесс, который не завершается. p.pid тогда будет идентификатором вашего процесса cmd, и p.kill() должен сработать.
Ответ 3
Если вы можете использовать psutil, это отлично работает:
import subprocess
import psutil
def kill(proc_pid):
process = psutil.Process(proc_pid)
for proc in process.children(recursive=True):
proc.kill()
process.kill()
proc = subprocess.Popen([«infinite_app», «param»], shell=True)
try:
proc.wait(timeout=3)
except subprocess.TimeoutExpired:
kill(proc.pid)
Ответ 4
Я мог бы сделать это, используя:
from subprocess import Popen
process = Popen(command, shell=True)
Popen(«TASKKILL /F /PID /T».format(pid=process.pid))
Это завершает cmd.exe программу, для которой дается эта команда ( в Windows).
Ответ 5
Ни один из ответов у меня не сработал, поэтому я даю код, который действительно работает. В моем случае даже после завершения процесса .kill() и получения .poll() кода возврата, процесс не завершился.
Следуя subprocess.Popen из документации :
«. для правильной очистки приложение с допустимым поведением должно завершить дочерний процесс и завершить обмен данными . »
proc = subprocess.Popen(. )
try:
outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
proc.kill()
outs, errs = proc.communicate()
В моем случае мне не хватало proc.communicate() после вызова proc.kill() . Это очищает процесс stdin, stdout . и завершает процесс.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.