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

Linux下top命令控制台正常但Python subprocess调用报错的解决

问题原因及解决方法

原因分析

问题根源在于Python字符串的转义逻辑与终端shell的解析逻辑不一致:
在终端执行命令时,tr "\n" ","里的\n由shell解析为换行符;但在Python字符串中直接写\n时,Python会先将其转换成实际的换行符再传递给shell,导致tr命令收到的参数不符合预期,无法将pgrep的输出转换成逗号分隔的PID列表。最终top的-p选项没有获取到有效参数,触发option requires an argument -- 'p'错误。无论替换成哪个进程,只要Python字符串里的\n未正确处理,问题都会持续存在。

解决方法

方法1:修正Python字符串的转义

通过转义符或原始字符串,让Python不解析\n,直接传递给shell处理:

import subprocess

# 方式1:用转义符处理\n
cmd = 'top -b -n 1000 -d 1 -p `pgrep Discord | tr "\\n" "," | sed "s/,$//"` > test.txt'
subprocess.run(cmd, shell=True)

# 方式2:使用原始字符串
cmd = r'top -b -n 1000 -d 1 -p `pgrep Discord | tr "\n" "," | sed "s/,$//"` > test.txt'
subprocess.run(cmd, shell=True)

方法2:用Python直接处理PID(更推荐)

避免依赖shell的命令替换,用Python自行获取PID并构造命令,既安全又能规避转义问题:

import subprocess

# 获取Discord的PID列表
pgrep_proc = subprocess.run(
    ['pgrep', 'Discord'],
    capture_output=True,
    text=True,
    check=False  # 未找到进程时不直接报错,后续可自行处理
)
# 过滤空行,整理成逗号分隔的字符串
pids = [pid.strip() for pid in pgrep_proc.stdout.split('\n') if pid.strip()]
pid_str = ','.join(pids)

if pid_str:
    # 执行top命令并将结果写入文件
    with open('test.txt', 'w') as out_file:
        subprocess.run(
            ['top', '-b', '-n', '1000', '-d', '1', '-p', pid_str],
            stdout=out_file
        )
else:
    print("未找到Discord进程")

内容的提问来源于stack exchange,提问作者M1hv771

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:47:10