如何使用Python显示当前用户的进程列表?

3

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


请查看此网站:https://dev59.com/uHE85IYBdhLWcg3wl0nF - dgsleeps
6个回答

1
使用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服务器机器上(我没有管理员权限),我无法获取proc.username()而不出现psutil.AccessDenied异常。所以我尝试在辅助程序中捕获异常,结果遇到了另一个奇怪的错误,因此我放弃了整个想法,并基于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]

0

我在这种情况下使用以下内容,检查它是否对您有帮助。目前它正在检查当前用户名,但您可以自定义它。

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

0

在使用了几天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 USERDOMAIN\USERNAME 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
    

0
import subprocess

ps = subprocess.Popen('ps -ef', shell=True, stdout=subprocess.PIPE)
print ps.stdout.readlines()

0
你可以尝试使用psutil.process_iter()。例如:
import psutil
pids=[process.pid for process in psutil.process_iter() if 
        process.username == 'root']

在这种情况下,我假设您想要查找由“root”用户运行的每个进程。

我喜欢这个答案,它避免了调用子进程的开销。 - guettli
1
在运行大量进程的计算机上执行时,这个非常慢。另外,看起来 process.username 是一个方法,所以应该使用 process.username()。 - Pavel Chernikov
此外,调用process.username()可能会引发psutil.AccessDenied异常。因此无法以此方式进行过滤。 - Jean-François Fabre

-2

popen非常好用,因为你可以通过grep、cut等运行指令。这样你就可以将信息量具体地调整到你想要的程度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接