Я использую Python 2.7 и Windows 7 64 бит. Я хочу знать, запущен ли процесс (python.exe) в диспетчере задач / Процессы. Я прошел через http://www.videntity.com/2010/05/check-to-make-sure-a-process-is-running-and-restart-it-if-its-not-a-recipe-in-python/, но это не для windows.
user2622785 12 мар ’14 в 12:43 2014-03-12 12:43
2014-03-12 12:43
3 ответа
На странице, на которую вы ссылаетесь, используется os.popen()( официальные документы здесь)
В Windows вы должны использовать «список задач» в качестве аргумента для os.popen(), а не «ps -Af»
>>> import os >>> tmp = os.popen(«tasklist»).read() # it would return a str type >>> «python.exe» in tmp True
user2601851 12 мар ’14 в 13:08 2014-03-12 13:08
2014-03-12 13:08
Вот как я это делаю с win32 :
from win32com.client import GetObject WMI = GetObject(‘winmgmts:’) processes = WMI.InstancesOf(‘Win32_Process’) if «python.exe» in [process.Properties_(‘Name’).Value for process in processes]: #do the thing
Источник: stackru.com
Как узнать, что в работе python telegram bot произошла ошибка?
Проверка Python, запущен процесс или нет
Я пытаюсь создать скрипт на Python, который позже я буду запускать как сервис. Теперь я хочу запускать определенную часть кода только во время работы iTunes. Из некоторых исследований я понимаю, что опрос всего списка команд, а затем поиск приложения для этого списка стоит дорого.
Я обнаружил, что процессы в операционных системах на основе UNIX создают файл блокировки для уведомления о том, что программа в данный момент выполняется, и в этот момент мы можем использовать os.stat(location_of_file) чтобы проверить, существует ли файл, чтобы определить, запущена ли программа или не.
Существует ли аналогичный файл блокировки, созданный в Windows?
Если нет, то каковы различные способы в Python, с помощью которых мы можем определить, запущен процесс или нет?
Я использую Python 2.7 и интерфейс iTunes COM.
ОТВЕТЫ
Ответ 1
Вы не можете полагаться на блокировку файлов в Linux или Windows. Я бы просто укусил пулю и перебрал все работающие программы. Я правда не верю, что это будет так «дорого», как вы думаете. psutil — превосходный кроссплатформенный кабель модуля Python для перечисления всех запущенных программ в системе.
import psutil «someProgram» in (p.name() for p in psutil.process_iter())
Ответ 2
import subprocess def process_exists(process_name): call = ‘TASKLIST’, ‘/FI’, ‘imagename eq %s’ % process_name # use buildin check_output right away output = subprocess.check_output(call) # check in last line for process name last_line = output.strip().split(‘rn’)[-1] # because Fail message could be translated return last_line.lower().startswith(process_name.lower())
и теперь вы можете сделать:
Как узнать запущена ли cs go 100% способ
>>> process_exists(‘eclipse.exe’) True >>> process_exists(‘AJKGVSJGSCSeclipse.exe’) False
Чтобы не вызывать это несколько раз и иметь обзор всех процессов таким образом, вы можете сделать что-то вроде:
# get info dict about all running processes call = ‘TASKLIST’, ‘/FO’, ‘CSV’ output = subprocess.check_output(call) # get rid of extra » and split into lines output = output.replace(‘»‘, »).split(‘rn’) keys = output[0].split(‘,’) proc_list = [i.split(‘,’) for i in output[1:] if i] # make dict with proc names as keys and dicts with the extra nfo as values proc_dict = dict( [( i[0], dict(zip(keys[1:], i[1:])) ) for i in proc_list] ) print(proc_dict.keys())
Ответ 3
Файлы блокировки обычно не используются в Windows (и редко в Unix). Обычно, когда программа Windows хочет увидеть, что другой экземпляр уже запущен, он вызовет FindWindow с известным названием или именем класса.
def iTunesRunning(): import win32ui # may need FindWindow(«iTunes», None) or FindWindow(None, «iTunes») # or something similar if FindWindow(«iTunes», «iTunes»): print «Found an iTunes window» return True
Ответ 4
Я хотел бы добавить это решение в список в исторических целях. Он позволяет вам найти на основе .exe вместо заголовка окна, а также вернуть использованную память и PID.
processes = subprocess.Popen(‘tasklist’, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] # Put a regex for exact matches, or a simple ‘in’ for naive matches
Вырез из примера вывода:
notepad.exe 13944 Console 1 11,920 K python.exe 5240 Console 1 28,616 K conhost.exe 9796 Console 1 7,812 K svchost.exe 1052 Services 0 18,524 K iTunes.exe 1108 Console 1 157,764 K
Ответ 5
Вы были бы довольны тем, что ваша команда Python запускает другую программу для получения информации?
Если это так, я бы посоветовал вам взглянуть на PsList и все его варианты. Например, следующее будет сообщать вам о любом запущенном процессе iTunes
PsList itunes
Если вы можете понять, как интерпретировать результаты, это, надеюсь, вам поможет.
Edit:
Когда я не запускаю iTunes, я получаю следующее:
pslist v1.29 — Sysinternals PsList Copyright (C) 2000-2009 Mark Russinovich Sysinternals Process information for CLARESPC: Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time iTunesHelper 3784 8 10 229 3164 0:00:00.046 3:41:05.053
С запуском itunes я получаю эту дополнительную строку:
iTunes 928 8 24 813 106168 0:00:08.734 0:02:08.672
Однако следующая команда выводит информацию только о самой программе iTunes, то есть аргументе -e :
pslist -e itunes
Ответ 6
win32ui.FindWindow(classname, None) возвращает дескриптор окна, если найдено какое-либо окно с заданным именем класса. В противном случае он поднимает window32ui.error .
import win32ui def WindowExists(classname): try: win32ui.FindWindow(classname, None) except win32ui.error: return False else: return True if WindowExists(«DropboxTrayIcon»): print «Dropbox is running, sir.» else: print «Dropbox is running. not.»
Я обнаружил, что имя класса окна для значка в Dropboxbox было DropboxTrayIcon, используя Autohotkey Window Spy.
Ответ 7
Psutil, предложенный Mark, на самом деле является лучшим решением, единственным недостатком является лицензия, совместимая с GPL. Если это проблема, вы можете вызвать команды информации о процессе Windows: wmic process , где доступен WMI (XP pro, vista, win7) или tasklist . Вот описание, чтобы сделать это: Как вызвать внешнюю программу на python и получить код вывода и возврата? (не единственный возможный способ. )
Ответ 8
Если вы не можете полагаться на имя процесса, например, скрипты python, которые всегда будут иметь имя python.exe. Если этот метод очень удобен,
import psutil psutil.pid_exists(pid)
проверить документы для получения дополнительной информации http://psutil.readthedocs.io/en/latest/#psutil.pid_exists
Ответ 9
Это хорошо работает
def running(): n=0# number of instances of the program running prog=[line.split() for line in subprocess.check_output(«tasklist»).splitlines()] [prog.pop(e) for e in [0,1,2]] #useless for task in prog: if task[0]==»itunes.exe»: n=n+1 if n>0: return True else: return False
Ответ 10
import psutil for p in psutil.process_iter(attrs=[‘pid’, ‘name’]): if «itunes.exe» in (p.info[‘name’]).lower(): print(«yes», (p.info[‘name’]).lower())
Ответ 11
Если вы тестируете приложение с помощью Behave, вы можете использовать pywinauto . Аналогично предыдущему комментарию, вы можете использовать эту функцию:
def check_if_app_is_running(context, processName): try: context.controller = pywinauto.Application(backend=’uia’).connect(best_match = processName, timeout = 5) context.controller.top_window().set_focus() return True except pywinauto.application.ProcessNotFoundError: pass return False
backend может быть ‘uia’ или ‘win32’
timeout , если в отношении силы повторно соединиться с приложением в течение 5 секунд.
Ответ 12
import subprocess as sp for v in str(sp.check_output(‘powershell «gps | where «‘)).split(‘ ‘): if len(v) is not 0 and ‘-‘ not in v and ‘\r\’ not in v and ‘iTunes’ in v: print(‘Found !’)
Источник: utyatnishna.ru
Проверьте, запущен ли процесс или нет в Windows с помощью Python
Я пытаюсь создать сценарий Python, который позже буду запускать как службу. Теперь я хочу запускать определенную часть кода только при запущенном iTunes. Из некоторых исследований я понимаю, что опрос всего списка команд с последующим поиском приложения для этого списка стоит дорого.
Я обнаружил, что процессы в операционных системах на основе UNIX создают файл блокировки, чтобы уведомить о том, что программа в настоящее время запущена, и в этот момент мы можем использовать os.stat(location_of_file) чтобы проверить, существует ли файл, чтобы определить, запущена программа или нет. Создан ли аналогичный файл блокировки в Windows? Если нет, то каковы различные способы в Python, с помощью которых мы можем определить, запущен процесс или нет? Я использую Python 2.7 и интерфейс iTunes COM.
задан 16 окт.
Что делает COM-интерфейс, если iTunes не работает? — Gabe
Если создать объект с помощью COM-интерфейса в Python, COM-интерфейс автоматически откроет iTunes. — nightf0x
Что бы это ни стоило, это зависит от отдельной программы, хочет ли она создать файл блокировки или файл PID. Не все программы Linux / UNIX это делают. — David Z
19 ответы
Вы не можете полагаться на файлы блокировки в Linux или Windows. Я бы просто стиснул зубы и перебрал все запущенные программы. Я действительно не верю, что это будет так «дорого», как вы думаете. псутил это отличный кроссплатформенный кабель модуля Python для перечисления всех запущенных программ в системе.
import psutil «someProgram» in (p.name() for p in psutil.process_iter())
ответ дан 03 апр.
После опробования этой программы доступ к некоторым процессам запрещен, даже когда я запускаю ее как администратор. Я, вероятно, просто буду использовать try и за исключением того, чтобы игнорировать эти экземпляры, но это то, чего нужно остерегаться — TrevorKirkby
Теперь похоже на BSD — Энтони
Предупреждение: это вызывает psutil.NoSuchProcess исключение, если процесс, который psutil.get_pid_list() вернулся уже вышел, когда psutil.Process(i).name выполняется. Обязательно поймите это. — фнкр
Остерегайтесь случая. Результат чувствителен к регистру. — user3103059
В тестах, которые я проводил, этот метод чуть более чем в 10 раз быстрее, чем subprocess позвонить tasklist (для Windows). — S3DEV
import subprocess def process_exists(process_name): call = ‘TASKLIST’, ‘/FI’, ‘imagename eq %s’ % process_name # use buildin check_output right away output = subprocess.check_output(call).decode() # check in last line for process name last_line = output.strip().split(‘rn’)[-1] # because Fail message could be translated return last_line.lower().startswith(process_name.lower())
и теперь вы можете:
>>> process_exists(‘eclipse.exe’) True >>> process_exists(‘AJKGVSJGSCSeclipse.exe’) False
Чтобы не вызывать это несколько раз и иметь обзор всех процессов таким образом, вы можете сделать что-то вроде:
# get info dict about all running processes import subprocess output = subprocess.check_output((‘TASKLIST’, ‘/FO’, ‘CSV’)).decode() # get rid of extra » and split into lines output = output.replace(‘»‘, »).split(‘rn’) keys = output[0].split(‘,’) proc_list = [i.split(‘,’) for i in output[1:] if i] # make dict with proc names as keys and dicts with the extra nfo as values proc_dict = dict((i[0], dict(zip(keys[1:], i[1:]))) for i in proc_list) for name, values in sorted(proc_dict.items(), key=lambda x: x[0].lower()): print(‘%s: %s’ % (name, values))
Источник: stackovergo.com