使用 Python 分离 ps 的输出
- 2024-11-11 08:26:00
- admin 原创
- 24
问题描述:
在 Linux 上,命令 ps aux 输出进程列表,每个统计信息都有多列。例如
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...
postfix 22611 0.0 0.2 54136 2544 ? S 15:26 0:00 pickup -l -t fifo -u
apache 22920 0.0 1.5 198340 16588 ? S 09:58 0:05 /usr/sbin/httpd
我希望能够使用 Python 读取它并分离出每一行和每一列,以便它们可以用作值。
大多数情况下,这不是问题:
ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
processes = ps.split('
')
我现在可以循环遍历各个进程来获取每一行并用空格将其拆分开,例如
sep = re.compile('[s]+')
for row in processes:
print sep.split(row)
然而,问题是最后一列,即命令,有时会有空格。在上面的例子中,可以在命令中看到这一点
pickup -l -t fifo -u
将其拆分为
['postfix', '22611', '0.0', '0.2', '54136', '2544', '?', 'S', '15:26', '0:00', 'pickup', '-l', '-t', 'fifo', '-u']
但我真的想要的是:
['postfix', '22611', '0.0', '0.2', '54136', '2544', '?', 'S', '15:26', '0:00', 'pickup -l -t fifo -u']
所以我的问题是,我怎样才能分割出列,但是当涉及到命令列时,将整个字符串保留为一个列表元素而不是用空格分割?
解决方案 1:
使用第二个参数来split
指定将字符串拆分成的最大字段数。我猜你可以通过计算第一行中的字段数(即列标题)来找到这个数字。
ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
processes = ps.split('
')
# this specifies the number of splits, so the splitted lines
# will have (nfields+1) elements
nfields = len(processes[0].split()) - 1
for row in processes[1:]:
print row.split(None, nfields)
解决方案 2:
查看python.psutils包。
psutil.process_iter
返回一个生成器,您可以使用它来迭代所有进程。p.cmdline
是每个 Process 对象的 cmdline 参数的列表,按照您想要的方式分隔。
(pid,cmdline,path)
您可以仅用一行创建一个 pids vs 字典,然后以任何您想要的方式使用它。
pid_dict = dict([(p.pid, dict([('pid',p.pid), ('cmdline',p.cmdline), ('path',p.path)]))
for p in psutil.process_iter()]))
解决方案 3:
为什么不改用PSI?PSI 提供有关 Linux 和其他 Unix 变体的进程信息。
import psi.process
for p in psi.process.ProcessTable().values(): …
解决方案 4:
maxsplit
该方法的可选参数可能split
会帮助您:
sep.split.(row, maxsplit=42)
解决方案 5:
以下是一些可以帮助您入门的良好例程和用法:
def getProcessData():
ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
processes = ps.split('
')
# this specifies the number of splits, so the splitted lines
# will have (nfields+1) elements
nfields = len(processes[0].split()) - 1
retval = []
for row in processes[1:]:
retval.append(row.split(None, nfields))
return retval
wantpid = int(contents[0])
pstats = getProcessData()
for ps in pstats:
if (not len(ps) >= 1): continue
if (int(ps[1]) == wantpid):
print "process data:"
print "USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND"
print "%-10.10s %10.10s %10.10s %10.10s %10.10s %10.10s %10.10s %10.10s %10.10s %s" % (ps[0], ps[1], ps[2], ps[3], ps[4], ps[5], ps[6], ps[7], ps[8], ps[9])
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD