【问题标题】:How do I show a list of processes for the current user using python?如何使用 python 显示当前用户的进程列表?
【发布时间】:2015-02-27 02:09:27
【问题描述】:

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

【问题讨论】:

标签: python process


【解决方案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 服务器计算机上(我没有管理员权限)我无法在没有 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 模块轻松解析。然后,我们只保留前 2 列(名称和 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]

【讨论】:

    【解决方案2】:
    import subprocess
    
    ps = subprocess.Popen('ps -ef', shell=True, stdout=subprocess.PIPE)
    print ps.stdout.readlines()
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我喜欢这个答案,它避免了调用子进程的开销。
      • 这在运行大量进程的机器上执行时非常慢。另外,看起来 process.username 是一个方法,所以应该是 process.username()
      • 同时调用process.username() 可以抛出psutil.AccessDenied 异常。所以无法以这种方式过滤。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        在使用 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
            
        

        【讨论】:

          【解决方案6】:

          popen 效果很好,因为您可以通过 grep、cut 等运行操作。因此您可以根据自己的需要定制信息。

          【讨论】:

            猜你喜欢
            • 2010-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-25
            • 2011-07-03
            相关资源
            最近更新 更多