如何处理python调用的命令的输出

2024-10-01 11:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想编写一个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”?也就是说,不是逐个分析, 我能一个一个字符串地解析它吗?在

输出变量如下(解析前):

^{pr2}$

谢谢!在


Tags: 方法程序ipoutputifchecksubprocessprint
3条回答

实际上不需要一次迭代输出一个字符。在

首先,您应该将输出字符串拆分成几行,然后迭代这些行,一次处理一个。这是通过使用字符串的splitlines方法实现的(有关详细信息,请参见the docs)。在

您可以使用split()进一步分割空白行,但是考虑到输出的规则性,regular expression很适合这个要求。基本上,如果第一个字符是ms,那么接下来的数字就是您的id,m还是{}匹配决定了下一步的操作。在

您可以使用名称来标识所标识的字符组,这使得正则表达式的读取更加容易,并且由于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

您可以在ipcs输出时逐行导入输出。然后我将使用.strip().split()来解析每一行,并使用类似于tryexcept块来确保该行符合您的条件。将它解析为一个字符流会使事情变得更复杂,我不推荐它。。在

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()

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

所以你可以利用

for line in output:
   if (line.split(" ")[0] == 'm')):
      id = line.split(" ")[2]
      print id

相关问题 更多 >