2016-07-26 7 views
0

私はPythonサーバースクリプトで2つのサブプロセスを実行しています。サブプロセスの目的は、私のラズベリーパイからビデオをストリーミングすることです。別のコマンドでサブプロセスをkillする方法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にアクセスできないことです。私は、以前はグローバル変数としてプロセスを宣言し、どこからでもアクセスできるようにJavaで作業していましたが、明らかにPythonでは動作しません。 – Oliver

+0

また、モジュールには属性がありません。 – Oliver

答えて

1

あなたがここにいくつかのコンテキストを逃しているが、同様に基本的にサーバが何かをするでしょう:重要な部分は、名前ppnが同じスコープ内に存在し、したがって、彼らはのいずれかの種類を使用せずにアクセス可能であることである

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

グローバルな状態。コード構造が異なる場合は、問題の概要を説明する必要があります。

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はPython 2.6から入手可能であり、うまく動作するはずです - 私は質問のコメントでは問題だかわからないんだけど。

+0

私の更新されたコードを見てください。それは私のサーバーコードが現在見える方法です。 – Oliver

+0

また、上記のようにterminate()は機能しません。 – Oliver

+0

私はそれを動作させることができません。私のPopenオブジェクトへの参照を渡すことによって、あなたはどういう意味ですか? – Oliver

関連する問題