Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理python调用的命令的输出_Python_Python 2.7 - Fatal编程技术网

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

如何处理python调用的命令的输出,python,python-2.7,Python,Python 2.7,我想编写一个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

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

这是输出变量的外观(在解析之前):


谢谢

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

所以你可以用

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

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

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

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

首先,您应该将输出字符串分成几行,并在这些行上迭代,一次处理一行。这是通过使用字符串的
分割线
方法实现的(有关详细信息,请参阅)

您可以使用
split()
,进一步拆分空白行,但考虑到输出的规律性,a非常适合。基本上,如果第一个字符是
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
重新导入
模式=重新编译('^((?Pm)|(?Ps))\s+(?P\d+))
对于输出中的行。拆分行():
m=模式匹配(线)
如果m:
groups=m.groupdict()
_id=组['id']
如果组['mem']:
打印“处理内存行”
通过#手柄记忆盒
其他:
打印“处理信号灯行”
通过#处理信号量情况

请仅使用“回答”框回答问题,而不是询问更多信息。您缺少一个
proc.wait()
(或在完成过程后获取过程的其他方式)。您不需要调用
strip()
,因为没有前导空格或尾随空格。您也可以使用
splitlines()
代替
拆分('\n')
。对于像这个问题这样明显特定于Unix的问题,没有真正的优势,但仍然值得养成一般考虑行的习惯。这是指特定于linux,还是与任何带有SysV ipc的POSIX ish系统一起工作?因为我相信linux有非标准的方式来获取相同的信息,这种方式是机器处理的。另外,你可以使用
ipcs-m
ipcs-s
来代替
ipcs-s
,这样你就会知道每一行(除了标题)都是合适的类型,因此,您真正需要做的就是从qwwqwq的答案中获取ID的
int(line.split()[1])
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