我知道它与/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 服务器机器上(我没有管理员权限)我无法获得 proc.username()没有得到 psutil.AccessDenied异常(exception)。所以我试图在辅助例程中捕获异常,这导致了另一个奇怪的错误,所以我放弃了整个想法并基于 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]
