我有一个Python脚本,可以使用subprocess
执行其他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)
答案 0 :(得分:2)
因为您没有检查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)