2017-04-14 10 views
0

pythonでサブプロセスを開始して終了させる関数を書くにはどうすればよいですか?python関数からサブプロセスを開始して終了する

これはこれまでのところ私のコードです:私はこのコードを実行すると

import subprocess 
import signal 
import time 

def myfunction(action): 
    if action == 'start': 
     print 'Start subrocess' 
     process = subprocess.Popen("ping google.com", shell=True) 
    if action == 'stop': 
     print 'Stop subrocess' 
     process.send_signal(signal.SIGINT) 

myfunction('start') 
time.sleep(10) 
myfunction('stop') 

は、私はこのエラーを取得する:

Traceback (most recent call last): 
    File "test.py", line 15, in <module> 
    myfunction('stop') 
    File "test.py", line 11, in myfunction 
    process.send_signal(signal.SIGINT) 
UnboundLocalError: local variable 'process' referenced before assignment 
+0

変数プロセスが破壊されて動作します。 QuickFixはグローバル変数またはOOPです。 – Serge

+0

woah @ Serge、すばやくグローバル変数を提案しないでください!この場合は特に、先に進むべき他の多くの迅速な修正があります。 – waterproof

答えて

0

あなたはOOPを学び、コンストラクタとデストラクタではMyClassを定義する必要があります。 は、プロセスの実行多くのコピーを必要としない、それはいくつかの新しいプロセスを作成することができますよう、それはより多くのエキゾチックな我々は

class MyClass(object): 
    @classmethod 
    def start(self) 
     print 'Start subrocess' 
     self.process = subprocess.Popen("ping google.com", shell=True) 

    @classmethod 
    def stop(self) 
     self.process.send_signal(signal.SIGINT) 

MyClass.start() 
MyClass.stop() 

これではない理想的なクラスのメソッドを使用することができます作成​​すると仮定します。 このような場合にはシングルトンパターンが使用されていますが、これは1つのプロセスしか実行されていないことを保証します。

最小限の修正(MyFunctionのを維持するには)変数にプロセスを保存することです:

import subprocess 
import signal 
import time 

def myfunction(action, process=None): 
    if action == 'start': 
     print 'Start subrocess' 
     process = subprocess.Popen("ping google.com", shell=True) 
     return process 
    if action == 'stop': 
     print 'Stop subrocess' 
     process.send_signal(signal.SIGINT) 

process = myfunction('start') 
time.sleep(10) 
myfunction('stop', process) 
1

あなたのサブプロセス変数を保存し、機能にそれを渡す必要があります。 myfunction('stop')に電話すると、機能範囲がprocessから(したがってUnboundLocalError)になることはありません。

print 'Start subrocess' 
process = subprocess.Popen("ping google.com", shell=True) 
time.sleep(10) 
print 'Stop subprocess' 
process.send_signal(signal.SIGINT) 
0

あなたが持っている問題は、ことによると思われる:あなたの問題は、プロセス処理と本当に関数スコープであるといないことを示している -

関数スコープがなければ、これは正常に動作する必要がありますprocessmyfunction内のローカル変数として、特に'start' ifステートメント内でのみ宣言されます。この小さな範囲は、myfunction('stop')を呼び出すと、その関数に 'process'変数の概念がないことを意味します。

これにはいくつかの方法がありますが、最も直観的なのは、myfunctionprocessを返したときに返され、1つをパラメータとして使用して閉じるときです。コードは次のようになります:

import subprocess 
import signal 
import time 


def myfunction(action, process=None): 
    if action == 'start': 
     print 'Start subrocess' 
     process = subprocess.Popen("ping google.com", shell=True) 
     return process  
    if action == 'stop': 
     print 'Stop subrocess' 
     process.send_signal(signal.SIGTERM) 



process = myfunction('start') 
time.sleep(10) 
myfunction('stop', process) 

私は2.7.13でこれを実行しているし、それは関数が実行されると罰金

関連する問題