python中通过进程名获取PID的跨平台方法
主机上正在运行多个同名进程。使用python或jython按名称获取这些进程的PID的跨平台方式是什么python中通过进程名获取PID的跨平台方法,python,cross-platform,jython,hp-ux,Python,Cross Platform,Jython,Hp Ux,主机上正在运行多个同名进程。使用python或jython按名称获取这些进程的PID的跨平台方式是什么 我想要类似于pidof的东西,但是用python。(反正我没有pidof) 我无法解析/proc,因为它可能不可用(在HP-UX上) 我不想运行os.popen('ps')并解析输出,因为我认为它很难看(不同操作系统中的字段序列可能不同) 目标平台是Solaris、HP-UX,可能还有其他平台 我认为,如果不使用/proc或命令行实用程序,您将无法找到一个纯粹基于python的可移植解决方案,
pidof
的东西,但是用python。(反正我没有pidof
)/proc
,因为它可能不可用(在HP-UX上)os.popen('ps')
并解析输出,因为我认为它很难看(不同操作系统中的字段序列可能不同)我认为,如果不使用/proc或命令行实用程序,您将无法找到一个纯粹基于python的可移植解决方案,至少在python本身中是这样。解析os.system并不难看——无论是您还是其他人,都必须有人处理多个平台。老实说,为您感兴趣的操作系统实现它应该是相当容易的。首先,Windows(在所有版本中)是一个非标准操作系统 Linux(和大多数专有unixen)是符合POSIX的标准操作系统 C库反映了这种二分法。Python反映了C库
没有“跨平台”的方法可以做到这一点。你必须为特定版本的Windows(XP或Vista)准备一些东西。恐怕没有。进程由pid而不是名称唯一标识。如果您真的必须按名称查找pid,那么您将使用您建议的东西,但它不会是可移植的,并且可能不会在所有情况下都起作用
如果您只需要找到某个应用程序的pid,并且您可以控制此应用程序,那么我建议更改此应用程序,将其pid存储在脚本可以找到它的某个位置的文件中。对于jython,如果使用Java 5,那么您可以获得Java进程id,如下所示: 从java.lang.management导入*
pid=ManagementFactory.getRuntimeMXBean().getName()没有单一的跨平台API,您必须检查操作系统。用于基于posix的使用/过程。对于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_进程可用属性的更多信息,请查看您可以使用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>
在“YourProcess.exe”的所有PID上做一个注释
我用Python 3在Debian上试用过,我认为它必须是
proc.name()
而不是proc.name
才有效,但我想得到另一个进程的PID(像pidof,但不使用pidof),不幸的是OS X不允许您访问进程的许多属性(名称、exe、cmdline),即使您只尝试访问由您创建的流程。除非您使用sudo运行解释器/脚本,那就是。是的,这是OSX的一个限制(它是唯一一个这样运行的平台)。除了使用sudo/setuid.Update之外,您什么也做不了,这对于不同的方法来说都是固定的,请参阅:在我的环境中。name
是一个方法,而不是属性。那么这将如何从多个python进程中识别我的进程呢?这个库不是python的标准库,至少不是2.7。没有检查其他版本。@ZoranPavlovic是的,它是包含构建的pywin32
包,答案应该包括这个,我不持有任何股份;我经常听到人们抱怨列表理解总是筛选列表的最佳方式,因为它更快。例如process=[proc for proc in psutil.process\u iter()如果proc.name==“YourProcess.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(p)
return ls
import psutil
process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
for i in process:
print i.name,i.pid
process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].