如何使用python为当前用户显示进程列表



我知道它与/proc有关,但我并不太熟悉。

教科书上的答案是使用psutil模块,如下所示:

import psutil,getpass,os
user_name = getpass.getuser()
process_dict = {proc.pid:proc.name() for proc in psutil.process_iter() if proc.username() == user_name}

它为当前用户进程生成一个以进程id为键、以进程名称为值的字典。

这种方法看起来不错,但在我的Windows服务器机器上(我没有管理权限),如果不获得psutil.AccessDenied异常,我就无法获得proc.username()。因此,我试图在助手例程中捕捉异常,这导致了另一个奇怪的错误,所以我放弃了整个想法,并基于tasklist命令构建了一个仅限Windows的解决方案:

tasklist /FI "USERNAME eq %USERNAME%" /FO CSV

其适用于python,并具有相同方便的pid=>用户名字典格式,翻译为:

import csv,subprocess
def get_current_user_processes():
   csv_output = subprocess.check_output(["tasklist","/FI","USERNAME eq {}".format(os.getenv("USERNAME")),"/FO","CSV"]).decode("ascii","ignore")
   cr = csv.reader(csv_output.splitlines())
   next(cr)   # skip title lines
   return {int(row[1]):row[0] for row in cr}

它告诉tasklist只保留当前用户进程,并使用csv输出格式,以便使用csv模块轻松解析。然后,我们只保留前两列(名称&pid),并将pid转换为整数,以便于度量。

它创建这样的字典:

{7808:"conhost.exe",12676:"dwm.exe",10120:"ssonsvr.exe",7052:"tasklist.exe",17028:"ccshelserver.exe",14876:"wfcrun32.exe",14364:"Receiver.exe",15024:"conhost.exe"}

现在,每个单独的进程都可以用psutil进行更深入的检查,而不会有访问被拒绝或其他奇怪错误的风险:

d = get_current_user_processes()
processes = [proc for proc in psutil.process_iter() if proc.pid in d]
import subprocess
ps = subprocess.Popen('ps -ef', shell=True, stdout=subprocess.PIPE)
print ps.stdout.readlines()

您可以尝试使用psutil.prrocess_iter()。例如:

import psutil
pids=[process.pid for process in psutil.process_iter() if 
        process.username == 'root']

在这种情况下,我认为您希望找到由"root"用户运行的每个进程

我在这种情况下使用以下内容,请检查这对您的情况是否有帮助。目前它正在检查当前用户名,但您可以对其进行成本计算。

import psutil 
processes = filter(lambda p: (p.username() == os.getlogin() and (p.name() == 'python')) , psutil.process_iter())
print(list(processes))

在使用psutil几天后,我发现这是最好的跨平台解决方案:

import psutil
def iter_user_procs():
    # get username of the current Python process.
    # Using this instead of something like os.getlogin() avoids cross-platform issues,
    # such as Windows using USERDOMAINUSERNAME instead of just USERNAME for process owners.
    username = psutil.Process.username()  # get username in format used by processes
    
    # get username from the info dict to avoid AccessDenied errors. See docs for iter_procs().
    for p in psutils.iter_procs(['username']):
        if p.info['username'] == username:
            yield p
    

popen的工作非常好,因为您可以通过grep、cut等来运行。因此,您可以根据自己的需要定制信息。

最新更新