Перейти к содержимому

Как закрыть процесс через python

  • автор:

Python, как правильно завершить процесс .exe?

Теперь через определённое время их нужно завершить, например третий профиль, потом пятый, первый и т.д
С этим я так и не разобрался.
Разобрался как убить все процессы firefox.exe:

os.system(«taskkill /im firefox.exe»)

Но при следующем запуске, firefox пишет что не корректно была завершена работа и просит запуститься в безопасном режиме.
При alt+f4 не ругается на некорректное завершение работы.
Вопрос в том как правильно завершить что бы он не ругался?
А ещё лучше как правильно завершить определённый профиль?

  • Вопрос задан более двух лет назад
  • 3518 просмотров

Комментировать
Решения вопроса 1

HemulGM

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

HemulGM

Hemul GM @HemulGM Куратор тега Python

Пётр Питаев, PostMessage(H, WM_QUIT, 0, 0);
H — Handle приложения (или окна)
PostMessage — это метод WInApi, гугли.

Ответы на вопрос 1

yupiter7575

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

  • 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

  • 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 . и завершает процесс.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *