You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:48:02