Межплатформенный способ получить PIDs процессом называет в Python

Используйте

Сбор данных изменений

Отслеживание изменений

или пример триггера / SQL Server Profiler

49
задан Julien 12 August 2016 в 07:53
поделиться

6 ответов

Вы можете использовать psutil ( https://github.com/giampaolo/psutil ), который работает в Windows и UNIX:

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    if proc.name() == PROCNAME:
        print(proc)

На моей машине он печатает:

<psutil.Process(pid=3881, name='python.exe') at 140192133873040>

EDIT 2017-04-27 - вот более продвинутая служебная функция, которая проверяет имя по имени процесса (), cmdline () и exe ():

import os
import psutil

def find_procs_by_name(name):
    "Return a list of processes matching 'name'."
    assert name, name
    ls = []
    for p in psutil.process_iter():
        name_, exe, cmdline = "", "", []
        try:
            name_ = p.name()
            cmdline = p.cmdline()
            exe = p.exe()
        except (psutil.AccessDenied, psutil.ZombieProcess):
            pass
        except psutil.NoSuchProcess:
            continue
        if name == name_ or cmdline[0] == name or os.path.basename(exe) == name:
            ls.append(name)
    return ls
70
ответ дан 7 November 2019 в 11:35
поделиться

Во-первых, Windows (всего это - воплощения), нестандартная ОС.

Linux (и большая часть собственного unixen) совместимые POSIX стандартные операционные системы.

библиотеки C отражают эту дихотомию. Python отражает библиотеки C.

нет никакого "межплатформенного" способа сделать это. Необходимо изрубить что-то с ctypes для конкретного релиза Windows (XP или Vista)

4
ответ дан S.Lott 7 November 2019 в 11:35
поделиться

Я не думаю, что Вы сможете найти чисто основанное на Python, портативное решение, не используя/proc или утилиты командной строки, по крайней мере, не в самом Python. Парсинг os.system не ужасен - кто-то должен иметь дело с несколькими платформами, быть им Вы или кто-то еще. Реализация его для ОС, которой Вы интересуетесь, должна быть довольно легкой, честно.

3
ответ дан David Cournapeau 7 November 2019 в 11:35
поделиться

Нет, я боюсь. Процессы однозначно определяются pid не по имени. Если действительно необходимо найти pid по имени, то у Вас будет использование, которое что-то как Вы предложило, но это не будет портативно и вероятно не будет работать во всех случаях.

, Если бы только необходимо найти pids для определенного приложения и Вы управляете этим приложением, затем я предложил бы изменить это приложение для хранения его pid в файлах в некотором месте, где сценарий может найти его.

1
ответ дан ubiyubix 7 November 2019 в 11:35
поделиться

Для jython, если Java 5 используется, то можно получить идентификатор процесса Java как следующее:

от java.lang.management импортируют *
pid = ManagementFactory.getRuntimeMXBean () .getName ()

1
ответ дан ccyu 7 November 2019 в 11:35
поделиться

Единого межплатформенного API не существует, вам придется проверять наличие ОС. Для использования на базе posix / proc. Для Windows используйте следующий код, чтобы получить список всех pid с соответствующими именами процессов

from win32com.client import GetObject
WMI = GetObject('winmgmts:')
processes = WMI.InstancesOf('Win32_Process')
process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes]

Затем вы можете легко отфильтровать нужные вам процессы. Для получения дополнительной информации о доступных свойствах Win32_Process ознакомьтесь с Win32_Process Class

12
ответ дан 7 November 2019 в 11:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: