2016-07-26 6 views
0

파이썬 서버 스크립트에서 두 개의 하위 프로세스를 실행하고 있습니다. 하위 프로세스의 목적은 내 Raspberry Pi에서 비디오를 스트리밍하는 것입니다.다른 명령을 사용하여 하위 프로세스를 종료하는 방법 python

내 질문은 다른 명령을 서버에 보낼 때 하위 프로세스를 죽이는 방법입니다. 현재 Popen()을 사용하여 하위 프로세스를 시작합니다.

이 코드는 서버가 "startStream"명령을 수신 할 때 사용하는 코드입니다. Twisted 라이브러리를 서버 프로토콜로 사용하고 있습니다.

class Echo(Protocol): 
    def connectionMade(self): 
     #self.transport.write("""connected""") 
     self.factory.clients.append(self) 
     print "clients are ", self.factory.clients 

    def connectionLost(self, reason): 
     self.factory.clients.remove(self) 

    def dataReceived(self, data): 
     print "data is ", data 

     if data == "startStream": 
      p = subprocess.Popen("raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &", shell=True) 
      pn = subprocess.Popen("LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i %s -o %s &" % (x,y), shell=True) 

나는 무엇을하고 싶습니다.

if data == "startStream": 
     p = subprocess.Popen("raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &", shell=True) 
     pn = subprocess.Popen("LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i %s -o %s &" % (x,y), shell=True) 
elif data == "stopStream": 
     os.kill(p.pid) 
     os.kill(pn.pid) 

감사합니다.

+1

'terminate()'? – BusyAnt

+0

문제는 stopStream을 호출 할 때 p 및 pn에 액세스 할 수 없다는 것입니다. 나는 방금 전역 변수로 프로세스를 선언 한 다음 어디서나 액세스 할 수 있지만 Python에서는 작동하지 않는 Java로 작업하고있었습니다. – Oliver

+0

또한 모듈은 속성을 가지고 있지 않다. – Oliver

답변

1

당신은 여기에 몇 가지 상황에 맞는 누락하고 있지만 같은 기본적으로 서버는 뭔가를 할 것이다 :

while True: 
    data = wait_for_request() 
    if data == 'startStream': 
     p = subprocess.Popen("raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &", shell=True) 
     pn = subprocess.Popen("LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i %s -o %s &" % (x,y), shell=True) 
    elif data == 'stopStream': 
     p.terminate() 
     pn.terminate() 

결정적인 부분은 이름 ppn이 같은 범위에 존재하고, 따라서 그들은 어떤 종류의를 사용하지 않고 액세스 할 수 있습니다 글로벌 상태. 코드 구조가 다른 경우 문제의 개요를 설명해야합니다.

data_received에는 각 호출마다 자체 범위가 있으므로 다른 방법으로 Popen 객체에 대한 참조를 전달해야합니다. 다행히도 클래스 인스턴스에서 참조를 유지할 수 있습니다.

def dataReceived(self, data): 
    if data=='startStream': 
     self.p = subprocess.Popen() # ... 
     self.pn = subprocess.Popen() # ... 
    elif data=='stopStream': 
     self.p.terminate() 
     self.pn.terminate() 

Popen.terminate 파이썬 2.6에서 사용할 수 있고 잘 작동합니다 - 나는 문제의 발언에 문제가 무엇 확실하지 않다.

+0

내 업데이트 된 코드를 참조하십시오. 그것이 내 서버 코드가 현재 어떻게 보이는지입니다. – Oliver

+0

또한 위와 같이 terminate()가 작동하지 않습니다. – Oliver

+0

나는 그것을 작동시킬 수 없다. Popen 객체에 대한 참조를 전달하면 무엇을 의미합니까? – Oliver