一、 需求

linux下获取当前进程所在内核的ID

二、参考

这里主要参考了3部分文章。

  1. python3 获取电脑磁盘、CPU、内存使用情况

但是不了解psutil库, 不知道有没有直接获取 core id 的方法。

  1. python使用内置os模块获取cpu序列号


    这个os库有个popen方法, 是可以通过用 python 执行 shell 命令的, 和 os.system() 有区别,os.system()只返回脚本的退出状态码,而os.popen()却可以得到脚本的执行结果。

  1. # windows
  2. import os
  3. cpu = os.popen('wmic cpu get processorid').read()
  4. cpu = cpu.strip().replace('\n', '').replace('\r', '').split(" ")
  5. cpu = cpu[len(cpu)-1]
  6. print(cpu)
  1. # Linux
  2. import os
  3. cpu = os.popen('/proc/cpuinfo').read()
  4. cpu = cpu.strip().replace('\n', '').replace('\r', '').split(" ")
  5. cpu = cpu[len(cpu)-1]
  6. print(cpu)

但是,即便在 linux 的 root 用户,执行上面的脚本,还是会没有权限执行:
/proc/cpuinfo Permission denied

当前还不知道有什么办法能够解决,希望有思路 的好心人能给些建议。

这里找到一篇解决办法,然鹅不相关,没办法解决当前问题:
python 使用os.popen运行Linux命令权限问题

参考:
(1) python os.popen() 方法
(2)os.system
(3)Python os.popen() 方法
(4)python 使用os.popen运行Linux命令权限问题

  1. subprocess 库

找不到原创参考连接了,sorry。

  1. import subprocess
  2. cmd = subprocess.Popen(['sudo','echo cat /proc/cpuinfo'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  3. out, error = cmd.communicate()
  4. memory = out.splitlines()
  5. print(memory)

当然,水平太菜, 还是不会用, 所以还是没成功。

随便附上一篇参考:

(1)python中的subprocess.Popen()使用

三、最终办法

当然没有创造新库和新思路,而且在上面几种思路的基础上,换了一条shell命令….

还是使用 os.popen()方法获取脚本的执行结果,不过这次的脚本不是直接查看 CPU文件的信息,而是使用

ps -eo pid,args,psr

这一行bash 会在终端打印出每个PID 对应的 CPU ID, 而且是一行一行的,所以需要当成字符串付给一个变量。
这里按照每行切割成一个list中的元素。

参考:

  1. [Linux小技巧]查看当前进程对应的CPU

四、附上最终代码

  1. import os
  2. """
  3. method : get_cpu_id(pid: int) -> str
  4. """
  5. def get_cpu_info() -> list:
  6. cmd = 'ps -eo pid,args,psr'
  7. cmd_res = os.popen(cmd).read()
  8. cmd_res = cmd_res.split('\n')
  9. cmd_res = cmd_res[1:-1]
  10. cpu_info = []
  11. for s in cmd_res:
  12. c = s[-1]
  13. cpu_info.append(s[0:-1].strip() + f' {c}')
  14. return cpu_info
  15. def get_cpu_id(pid: int) -> str:
  16. if pid is None or pid == 0:
  17. return None
  18. cpu_info = get_cpu_info()
  19. if cpu_info is None or len(cpu_info) == 0:
  20. return None
  21. for s in cpu_info:
  22. s: str
  23. if s.find(str(pid)) != -1:
  24. return s
  25. return None

最后:

  1. 转载了很多原创作者的文章, 如果觉得有侵权 , 还请联系本人, 2627724977@qq.com
  2. 本文只是个人实践学习总结笔记,文章可能有很多疏漏和错误,以及很多可以优化的解决办法,还请随意评论指正探讨。