Linux下smem命令自定义宽度失效,请求解决方法
解决smem命令输出不受终端宽度限制的问题
问题根源
smem不会像top那样读取COLUMNS环境变量调整输出宽度,它直接调用系统接口获取当前终端的实际尺寸,因此通过subprocess设置环境变量的方法对它无效。
可行解决方案
方案1:使用--no-terminal选项(推荐)
smem内置了跳过终端检测的参数,直接禁用终端宽度适配:
import subprocess # 用--no-terminal让smem输出完整命令名,不受终端宽度约束 output = subprocess.check_output(['smem', '-a', '--no-terminal'], text=True) print(output)
该选项会让smem忽略终端尺寸限制,直接打印完整的命令行内容。
方案2:模拟伪终端(适配旧版smem)
如果你的smem版本没有--no-terminal选项,可以用pty模块模拟一个宽终端:
import pty import os import subprocess def get_full_smem_output(): env = os.environ.copy() env['COLUMNS'] = '512' pid, fd = pty.fork() if pid == 0: os.execvpe('smem', ['smem', '-a'], env) else: output = os.read(fd, 1024*1024).decode() os.waitpid(pid, 0) return output print(get_full_smem_output())
伪终端会让smem误以为运行在宽终端环境中,从而输出完整内容。
方案3:使用机器可读格式解析
如果只需要提取命令名和内存数据,可使用t选项输出制表符分隔的格式,这种格式不受终端宽度限制,方便后续解析:
import subprocess import csv output = subprocess.check_output(['smem', '-t', '-k'], text=True) reader = csv.DictReader(output.splitlines(), delimiter='\t') for row in reader: print(f"命令: {row['Command']}, 物理内存: {row['RSS']}")
内容的提问来源于stack exchange,提问作者Sanket
相关产品推荐
相关产品推荐

