0

我想编写一个 python 程序,它调用 ipcs 并使用它的输出来删除共享内存段和信号量。我有一个可行的解决方案,但觉得必须有更好的方法来做到这一点。这是我的程序:

import subprocess

def getid(ip):
    ret=''
    while (output[ip]==' '):
        ip=ip+1
    while((output[ip]).isdigit()):
        ret=ret+output[ip]
        ip=ip+1
    return ret


print 'invoking ipcs'
output = subprocess.check_output(['ipcs'])
print output

for i in range (len(output)):
    if (output[i]=='m'):
        r=getid(i+1)
        print r
        if (r):
            op = subprocess.check_output(['ipcrm','-m',r])
            print op
    elif (output[i]=='s'):
        r=getid(i+1)
        print r
        if (r):
            op = subprocess.check_output(['ipcrm','-s',r])
            print op

print 'invoking ipcs'
output = subprocess.check_output(['ipcs'])
print output

特别是,有没有更好的写“getid”的方法?即,而不是逐个字符地解析它,我可以逐个字符串地解析它吗?

这是输出变量的样子(解析之前):

Message Queues:
T     ID               KEY        MODE       OWNER    GROUP

Shared Memory:
T     ID               KEY        MODE       OWNER    GROUP
m 262144                    0 --rw-rw-rw- xyz              None
m 262145                    0 --rw-rw-rw- xyz              None
m 262146                    0 --rw-rw-rw- xyz              None
m 196611                    0 --rw-rw-rw- xyz              None
m 196612                    0 --rw-rw-rw- xyz              None
m 262151                    0 --rw-rw-rw- xyz              None

Semaphores:
T     ID               KEY        MODE       OWNER    GROUP
s 262144                    0 --rw-rw-rw- xyz              None
s 262145                    0 --rw-rw-rw- xyz              None
s 196610                    0 --rw-rw-rw- xyz              None

谢谢!

4

3 回答 3

1

您可以在输出时ipcs逐行输入输出。然后我会用它.strip().split()来解析每一行,以及像一个try except块这样的东西来确保该行符合你的标准。将其解析为字符流会使事情变得更加复杂,我不推荐它..

import subprocess
proc = subprocess.Popen(['ipcs'],stdout=subprocess.PIPE)
for line in iter(proc.stdout.readline,''):
    line=line.strip().split()
    try:
        r = int(line[1])
    except:
        continue
    if line[0] == "m":
        op = subprocess.check_output(['ipcrm','-m',str(r)])
    elif line[0] == "s":
        op = subprocess.check_output(['ipcrm','-s',str(r)])
    print op
proc.wait()
于 2013-05-17T15:40:44.763 回答
1

实际上没有必要一次迭代输出一个字符。

一方面,您应该将输出字符串分成几行并对其进行迭代,一次处理一个。这是通过使用splitlines字符串方法完成的(有关详细信息,请参阅文档)。

您可以使用 进一步拆分空格上的行split(),但鉴于输出的规律性,正则表达式非常适合。基本上,如果第一个字符是mor s,则下一个数字是您的 id,而 or 是否m匹配s决定了您的下一步操作。

您可以使用名称来识别您识别的字符组,这样可以更轻松地阅读正则表达式并更轻松地处理结果,因为groupdict.

import re
pattern = re.compile('^((?P<mem>m)|(?P<sem>s))\s+(?P<id>\d+)')

for line in output.splitlines():
    m = pattern.match(line)
    if m:
        groups = m.groupdict()
        _id = groups['id']
        if groups['mem']:
            print 'handling a memory line' 
            pass #  handle memory case
        else:
            print ' handling a semaphore line' 
            pass #  handle semaphore case
于 2013-05-17T17:20:26.740 回答
-1

您可以使用字符串拆分方法根据其中的空格拆分字符串。

所以你可以使用,

for line in output:
   if (line.split(" ")[0] == 'm')):
      id = line.split(" ")[2]
      print id
于 2013-05-17T14:48:54.600 回答