0

ipcs を呼び出し、その出力を使用して共有メモリ セグメントとセマフォを削除する Python プログラムを作成したいと考えています。私は実用的な解決策を持っていますが、これを行うためのより良い方法が必要だと感じています. これが私のプログラムです:

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出力するときに、出力を1 行ずつパイプで渡すことができます。次に.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

一度に 1 文字ずつ出力を繰り返す必要はありません。

1 つは、出力文字列を複数の行に分割し、それらを繰り返し処理して、一度に 1 つずつ処理する必要があることです。これはsplitlines、文字列のメソッドを使用して行われます (詳細については、ドキュメントを参照してください)。

を使用して空白行をさらに分割することもできますがsplit()、出力の規則性を考えると、正規表現がうまく適合します。基本的に、最初の文字がmまたはsの場合、次の桁数が ID であり、 または が一致するかどうかによってmsのアクションが決まります。

名前を使用して、識別した文字のグループを識別することができます。これにより、正規表現が読みやすくなり、結果をより快適に処理できるようになり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 に答える