杀死由另一个脚本调用的子进程启动的python脚本(Windows)

时间:2019-10-11 08:57:54

标签: python subprocess

我正在尝试将ESA'2 sen2cor python-script集成到我的工作流程中。为此,我创建了一个子流程,通过该子流程我可以调用“ L2A_Process.bat”文件。 我想使用一个超时启动sen2cor-script,因为它会卡住并会不时冻结,以便在失败时自动重新启动。 要启动它并捕获超时,我成功使用了以下脚本:

据我所知。结果是sen2cor-script被暂停,给出以下输出:

app = Flask(__name__)
app.config['CORS_HEADERS'] = 'Content-Type'


@app.route("/")
def main():
    return "Welcome1"

if __name__ == "__main__":
   #app.run() ##Replaced with below code to run it using waitress 
   serve(app, host='0.0.0.0', port=8000,threads= 8)

我想知道如何使用其自己的所有子子流程(即“ L2A_Process.py”)正确终止子流程“ p”。

一些观察:

  • 此脚本需要在Windows上运行;

  • 我尝试在没有上面示例中使用过的creationflag的情况下终止子进程:这导致该子进程被终止,但是“ L2A_Process.py”脚本解析并保持运行(这是核心我的问题);

  • 我无法使用CTRL_C_EVENT,因为我想在循环中重新启动失败的“ L2A_Process.py”,直到成功。

1 个答案:

答案 0 :(得分:0)

此代码对我有用,可以在将S1的2数据从L1C转换为L2A时监视Sen2cor状态。 Sen2cor进程既耗时又占用CPU,因此请耐心等待。用DEM,DDV等创建L2A花费了半个小时。希望对您有所帮助

from subprocess import Popen, PIPE 
import os

pathtoprodS1C = "path_to_L1C_product"   // safe file 
outdirS2A = "output_dir"                // where L2A files will be placed  
pathtoL2Process = "path_to_L2A_Process" //if not in path

pathtoGIPP = "path_to_your_GIPP/L2A_GIPP.xml"

procName = "./L2A_Process"

os.chdir(pathtoL2Process)
import shlex
pcall = "./{} {} --output_dir {} --tif --GIP_L2A {}".format(procName, 
                                                pathtoprodS1C, 
                                                pathtoprodS2A,
                                                pathtoGIPP)
args = shlex.split(pcall)
print(args)
try:
    p = Popen(args, stdout=PIPE)
    eut = p.stdout.readline()
    while eut:
        eut = p.stdout.readline()
        print(eut)
finally:
    print('Sen2Cor is Done')
    
exit()