Вы можете использовать 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
Во-первых, Windows (всего это - воплощения), нестандартная ОС.
Linux (и большая часть собственного unixen) совместимые POSIX стандартные операционные системы.
библиотеки C отражают эту дихотомию. Python отражает библиотеки C.
нет никакого "межплатформенного" способа сделать это. Необходимо изрубить что-то с ctypes для конкретного релиза Windows (XP или Vista)
Я не думаю, что Вы сможете найти чисто основанное на Python, портативное решение, не используя/proc или утилиты командной строки, по крайней мере, не в самом Python. Парсинг os.system не ужасен - кто-то должен иметь дело с несколькими платформами, быть им Вы или кто-то еще. Реализация его для ОС, которой Вы интересуетесь, должна быть довольно легкой, честно.
Нет, я боюсь. Процессы однозначно определяются pid не по имени. Если действительно необходимо найти pid по имени, то у Вас будет использование, которое что-то как Вы предложило, но это не будет портативно и вероятно не будет работать во всех случаях.
, Если бы только необходимо найти pids для определенного приложения и Вы управляете этим приложением, затем я предложил бы изменить это приложение для хранения его pid в файлах в некотором месте, где сценарий может найти его.
Для jython, если Java 5 используется, то можно получить идентификатор процесса Java как следующее:
от java.lang.management импортируют *
pid = ManagementFactory.getRuntimeMXBean () .getName ()
Единого межплатформенного 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