2013-05-17 5 views
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 

감사합니다!

+0

이것은 Linux와 관련이 있으며, SysV ipc가있는 POSIX-ish 시스템에서 작동합니까? 왜냐하면 리눅스는 기계 처리가되는 방식으로이 같은 정보를 얻는 비표준 방식을 가지고 있다고 생각하기 때문입니다. – abarnert

+0

또한'ipcs'를 실행 한 후 타입을 파싱하는 대신에'ipcs -m'과'ipcs -s'를 사용할 수 있습니다. 그러면 헤더 (header) 외에 모든 라인이 적절한 타입임을 알게 될 것입니다. 그래서 당신이 정말로해야 할 일은 qwwqwwq가 ID를 얻기위한 답에서'int (line.split() [1])'입니다. – abarnert

답변

1

할 수 있습니다 그것을 출력으로 라인으로 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() 
+0

'proc.wait()'(또는 프로세스가 끝나면 얻을 수있는 다른 방법)가 없습니다. – abarnert

+0

선행 공백이나 후행 공백이 없으므로'strip()'호출이 필요 없습니다. – user2358643

-1

문자열 분할 방법을 사용하여 문자열을 공백을 기준으로 분할 할 수 있습니다.

그래서 당신은 사용할 수,

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

"대답"상자는 질문에 답할 때만 사용하고 자세한 정보는 요구하지 마십시오. – geoffspear

1

정말 한 번에 출력 한 문자를 반복 할 필요가 없습니다.

하나의 경우, 출력 문자열을 줄로 나누고 한 번에 하나씩 처리하여 반복하십시오. 이는 splitlines 문자열 방법을 사용하여 수행됩니다 (자세한 내용은 the docs 참조).

split()을 사용하여 공백에 줄을 더 분할 할 수 있지만 출력의 규칙 성을 고려하면 regular expression은 청구서에 잘 맞습니다. 기본적으로 첫 번째 문자가 m 또는 s 인 경우 다음 자릿수는 사용자의 ID이며 m 또는 s과 일치하는지 여부가 다음 작업을 결정합니다.

이름을 사용하여 식별 한 문자 그룹을 식별 할 수 있으므로 groupdict으로 인해 정규 표현식을 더 쉽게 읽고 더 쉽게 처리 할 수 ​​있습니다.

+0

'split ('\ n')'대신'splitlines()'을 사용할 수도 있습니다. 분명히 유닉스 특유의이 문제와 관련해서는 실질적인 이점은 없지만 일반적으로 회선을 생각하는 습관에 빠질 가치가있다. – abarnert

+0

좋은 지적, 내 대답을 업데이 트하겠습니다 –

관련 문제