如何测量Python子进程的内存使用情况?
获取Python子进程的内存使用量
方法一:使用psutil库(推荐)
psutil是跨平台的系统监控库,能精准获取进程内存数据,操作简单。
- 先安装库:
pip install psutil
- 代码实现(支持实时监控或获取最终内存):
import subprocess import psutil import time # 启动子进程(替换为你的目标命令,尽量避免shell=True,防止额外shell进程干扰) proc = subprocess.Popen(["your_command_here"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 关联psutil进程实例 ps_proc = psutil.Process(proc.pid) # 可选:实时监控内存,直到进程结束 while proc.poll() is None: mem_info = ps_proc.memory_info() # 转换为MB单位输出 rss_mb = mem_info.rss / (1024 * 1024) # 物理内存占用(常驻内存) vms_mb = mem_info.vms / (1024 * 1024) # 虚拟内存占用 print(f"子进程当前RSS内存: {rss_mb:.2f} MB, VMS内存: {vms_mb:.2f} MB") time.sleep(1) # 进程结束后获取最终内存数据 final_mem = ps_proc.memory_info() print(f"子进程最终RSS内存: {final_mem.rss/(1024*1024):.2f} MB") # 读取子进程输出(如果需要) out, err = proc.communicate()
方法二:不依赖第三方库,用系统原生命令
如果不想额外安装库,可根据系统类型用对应命令获取内存:
Linux/macOS 版本
import subprocess # 启动子进程 proc = subprocess.Popen(["your_command_here"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) proc.wait() # 用ps命令提取进程内存(RSS,单位KB) rss_kb = int(subprocess.check_output(["ps", "-o", "rss=", "-p", str(proc.pid)]).decode().strip()) print(f"子进程RSS内存: {rss_kb/1024:.2f} MB") # 读取输出 out, err = proc.communicate()
Windows 版本
import subprocess import re # 启动子进程 proc = subprocess.Popen(["your_command_here"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) proc.wait() # 用tasklist提取内存数据 task_output = subprocess.check_output(["tasklist", "/FI", f"PID eq {proc.pid}", "/FO", "CSV"]).decode() # 解析CSV格式的内存列(单位KB) for line in task_output.splitlines()[1:]: parts = line.split(',') if len(parts) >= 5: mem_kb = int(parts[4].replace('"', '').replace(' K', '')) print(f"子进程内存: {mem_kb/1024:.2f} MB") break # 读取输出 out, err = proc.communicate()
关键注意事项
- 尽量避免使用
shell=True:会额外启动shell进程(如bash),此时获取的PID是shell的PID,而非目标进程。如果必须用,可通过ps_proc.children()[0]获取shell的子进程(即目标进程)再监控内存。 rss是进程实际占用的物理内存,vms是虚拟内存,可根据需求选择监控指标。
内容的提问来源于stack exchange,提问作者Ivan Adanenko
相关产品推荐
相关产品推荐

