Windows 8/XP で Python 2.7 を使用しています。
次のコードを使用して別のプログラム B を実行するプログラム A があります。
p = Popen(["B"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
return
B はバッチ スクリプト C を実行します。C は長時間実行されるスクリプトであり、C が終了していなくても B を終了させたいと考えています。次のコード(B)を使用して実行しました:
p = Popen(["C"])
return
B を実行すると、期待どおりに動作します。ただし、A を実行すると、B が終了すると終了すると予想されました。しかし、B が既に終了していても、A は C が終了するまで待機します。何が起こっているのか、どのような解決策が考えられるのかについてのアイデアはありますか?
残念ながら、A を B のように変更するという明白な解決策は、オプションではありません。
この問題を説明するための機能サンプル コードを次に示します: https://www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1
zip ファイルは、次の内容の次のファイルで構成されます。
A.py
from subprocess import PIPE, Popen
import sys
def log(line):
with open("log.txt", "a") as logfile:
logfile.write(line)
log("\r\n\r\nA: I'll wait for B\r\n")
p = Popen(["C:\\Python27\\python.exe", "B.py"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
log("A: Done.\r\n")
sys.exit(0)
B.py
from subprocess import Popen, PIPE
import sys
def log(line):
with open("log.txt", "a") as logfile:
logfile.write(line)
log("B: launching C\r\n")
p = Popen(["C.bat"])
log("B: Not waiting for C at all. bye!\r\n")
sys.exit(0)
C.bat
@echo off
echo C: Start long running task : %time% >> "log.txt"
ping -n 10 127.0.0.1>nul
echo C: Stop long running task : %time% >> "log.txt"
どんな入力でも大歓迎です。