我有一个使用subprocess执行其他python脚本的python脚本。我的问题是,如果我想终止整个过程,请使用for。 crt-c,它将仅终止当前迭代,但开始执行下一个迭代。主要脚本:

for fold in range(10):
    comand = "python train_kfolds_pos.py {} {}".format(current_model,fold)
    print(comand)
    process = subprocess.Popen(comand, shell=True, stdout=subprocess.PIPE)
    process.wait()
    text = process.communicate()[0].decode("utf-8")
    print(text)

最佳答案

因为您没有检查wait()的返回码,所以即使子进程被中断,程序也将继续循环。

您应该检查它(并使用args列表/删除shell=True

for fold in range(10):
    comand = ["python","train_kfolds_pos.py",current_model,str(fold)]
    print(comand)
    process = subprocess.Popen(comand, stdout=subprocess.PIPE)
    rc = process.wait()
    # quit loop if return code is not 0
    if rc:
       print("aborted, returncode {}".format(rc))
       break
    text = process.communicate()[0].decode("utf-8")
    print(text)


这样做的副作用是,如果程序由于其他原因异常终止,它也会停止。

另外:您可以考虑不调用python子进程,而是直接在python train_kfolds_pos.py脚本和参数中调用函数。异常会自然传播(键盘中断异常也会如此)。就像是:

import train_kfolds_pos
for fold in range(10):
    train_kfolds_pos.compute(current_model,fold)

10-08 04:36