You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:55:58