我一直在做一个循环来从命令列表中调用子进程:
commands=[
'do a',
'do b']
for cmd in commands:
process = subprocess.run(cmd, shell=True, check=True)
if (process.returncode != 0):
raise RuntimeError(f'Lustre configuration failed: {cmd} returned non-zero exit status {process.returncode}\n STDERR: {process.stderr.decode("utf-8")}')
它让我知道我的脚本是否失败以及失败的原因
当我直接在子进程中使用“;”.join(commands)启动所有命令时,它工作正常,但现在我在循环中执行它,它会退出或随机杀死列表中的进程
这种行为背后有逻辑吗? subprocess.run 应该是同步的,所以我不应该得到这种错误
PS:更准确的命令是通过 sgdisk / partprobe / mkfs 和 mount 挂载文件系统
我尝试一起运行所有命令,并用“;”将它们连接起来或者 ” && ” 使用子进程的其他阻塞功能 没有任何结果
参见子流程文档
您正在使用
check=True
,如果进程返回非零退出代码,将导致您不处理的 python 异常。
如果您自己使用此块进行检查
if (process.returncode != 0):
没必要同时使用
check=True
。
至于为什么命令因非零代码而失败,需要更多信息,如果它返回非零退出,您应该能够从
process.stderr
中提取这些信息。