如何用Python实现SUMO仿真多次运行并修复语法报错
错误原因分析
你将import导入的performSIM模块对象直接转为字符串后传入exec执行,此时得到的字符串是模块的描述文本<module 'performSIM' from 'xxx'>,根本不是可执行的Python代码,因此触发语法错误。
推荐实现方案
方案1:封装主逻辑为函数调用(推荐)
先修改performSIM.py的代码结构,把仿真主逻辑封装为可接收参数的函数,既可以单独运行也可以被其他脚本调用:
# 保留你原有所有import、自定义函数的代码不变 def run_simulation(args): # 把你原有的仿真执行主逻辑全部移到这个函数内,参数通过args传入 # 你的原有仿真代码... # 仿真结束记得关闭traci连接 traci.close() if __name__ == "__main__": # 你原有的参数解析逻辑放在这里 parser = argparse.ArgumentParser() # 按你的需求添加参数,例如下方的仿真配置、随机种子参数 parser.add_argument('--sumocfg', type=str, default='your_road.sumocfg') parser.add_argument('--seed', type=int, default=0) args = parser.parse_args() run_simulation(args)
调用脚本running_Python.py修改为如下内容即可循环执行10次仿真:
import argparse import performSIM parser = argparse.ArgumentParser() # 和performSIM中定义的参数保持一致 parser.add_argument('--sumocfg', type=str, default='your_road.sumocfg') base_args = parser.parse_args() for i in range(10): # 每次循环传入不同的随机种子,保证每次仿真结果有差异 base_args.seed = i performSIM.run_simulation(base_args)
方案2:无需修改原文件,用子进程调用
如果不想改动原有performSIM.py的代码,可以直接通过子进程调用Python解释器运行脚本,和命令行执行的逻辑完全一致:
import subprocess import sys for i in range(10): # 命令内容和你手动在命令行运行performSIM.py的参数完全一致 cmd = [ sys.executable, 'performSIM.py', '--sumocfg', 'your_road.sumocfg', '--seed', str(i) ] # check=True会在子进程运行报错时直接抛出异常,方便排查问题 subprocess.run(cmd, check=True)
注意事项
- 每次仿真运行结束后必须关闭traci连接,避免端口占用报错,可在仿真逻辑末尾添加
traci.close(),或用try-finally逻辑保证异常场景下也能正常关闭连接 - 若需要每次仿真结果存在差异,需要在循环中设置不同的随机种子传入SUMO,否则相同配置下每次运行的仿真结果完全一致
- 两种方案传入的参数都需要和
performSIM.py中定义的参数规则保持一致,避免参数不匹配报错
内容的提问来源于stack exchange,提问作者Ifezue Obiako
相关产品推荐
相关产品推荐

