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
相关产品推荐
相关产品推荐

