我想写一个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谢谢!
发布于 2013-05-17 23:40:45
您可以在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-18 01:20:27
真的不需要一次迭代一个字符的输出。
首先,您应该将输出字符串拆分成行,然后遍历这些行,一次处理一个。这是通过使用字符串的splitlines方法来完成的(有关详细信息,请参阅the docs )。
您可以使用split()进一步在空格上拆分行,但是考虑到输出的规律性,regular expression非常适合。基本上,如果第一个字符是m或s,那么下一个数字位数就是您的id,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-17 22:48:55
您可以使用string split方法根据字符串中的空格拆分字符串。
所以你可以使用,
for line in output:
if (line.split(" ")[0] == 'm')):
id = line.split(" ")[2]
print idhttps://stackoverflow.com/questions/16611801
复制相似问题