2013-08-21 5 views
7

私はPythonスクリプト 'b.py'を使って5秒間の時間をプリントアウトしています。PythonスクリプトからPythonスクリプトを呼び出すにはどうすればいいですか

while (1): 
    print "Start : %s" % time.ctime() 
    time.sleep(5) 
    print "End : %s" % time.ctime() 
    time.sleep(5) 

そして、私のa.pyに、私がでb.pyを呼び出す:

def run_b(): 
     print "Calling run b" 
    try: 
     cmd = ["./b.py"] 

     p = subprocess.Popen(cmd, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.STDOUT) 

     for line in iter(p.stdout.readline, b''): 
         print (">>>" + line.rstrip()) 


    except OSError as e: 
     print >>sys.stderr, "fcs Execution failed:", e 

    return None 

と後で、私はによって 'b.py' を殺す:/ PS_PATH =「は/ usr/binにps -efW "

def kill_b(program): 
    try: 

     cmd = shlex.split(PS_PATH) 

     retval = subprocess.check_output(cmd).rstrip() 
     for line in retval.splitlines(): 

      if program in line: 
       print "line =" + line 
       pid = line.split(None)[1] 
       os.kill(int(pid), signal.SIGKILL) 

    except OSError as e: 
     print >>sys.stderr, "kill_all Execution failed:", e 
    except subprocess.CalledProcessError as e: 
     print >>sys.stderr, "kill_all Execution failed:", e 

run_b() 
time.sleep(600) 
kill_b("b.py") 

私には2つの質問があります。 1.なぜ 'b.py'からのプリントが表示されないのですか 'ps -efW'を実行すると 'b.py'という名前のプロセスが表示されません。 2.上記のようなプロセスを終了すると、なぜ「許可が拒否されました」と表示されますか?

上記のスクリプトをWindowsのcygwinで実行しています。

ありがとうございます。私は「b.py」とするとき私は「PS -efW」から任意のプリントアウトが表示されないのはなぜ

+6

インセプションパイソン – Nick

+1

'b.py'を殺すために簡単な方法は、' b.py'の出力を読んで)( 'p.killを呼び出すために開始する前にrun_b()' 'から' p'を返すことです。 p.wait() 'を呼び出します。 '。/ b.py'が' cmd'は 'sys.executable'する必要があるだろう、現在の1から別のPythonスクリプトを実行するには – jfs

+0

チェックまた、引数として渡されるスクリプト名 '' ./b.py "'を持つ必要があります。 – jfs

答えて

1
  1. 私は「b.py」という名前のプロセスが表示されませんか?

    変更run_b()ライン:

    p = subprocess.Popen(cmd, 
            stdout=sys.stdout, 
            stderr=sys.stderr) 
    

    あなたが "b.py" が、少し違う "Pythonのb.py" のようなものという名前のプロセスが表示されません。名前の代わりにpidを使用してください(コード "p.pid"にはpidがあります)。

  2. 上記のようなプロセスを終了すると、「許可が拒否されました」と表示されるのはなぜですか?

    os.killは、Windowsでは2.7+しかサポートされておらず、posixバージョンと少し違って動作します。しかし、あなたは "p.pid"を使うことができます。クロスプラットフォームな方法でプロセスを強制終了するための最良の方法は次のとおりです。OS Xと他のUnixyのオペレーティングシステムでも

    if platform.system() == "Windows": 
        subprocess.Popen("taskkill /F /T /PID %i" % p.pid, shell=True) 
    else: 
        os.killpg(p.pid, signal.SIGKILL) 
    

killpg作品。

+0

(' p.poll() '' NONE'する必要があります)が正常に起動していること – martineau

関連する問題