Mininet中for循环内用threading.Timer定时执行命令报错求助
解决threading.Timer传递变量参数的TypeError问题
看起来你在给threading.Timer传递参数时犯了一个常见的语法错误,我来帮你拆解问题并修复代码:
错误原因分析
你的代码里,字符串格式化操作%(ip, ips[ip])被错误地放在了threading.Timer()实例化语句的末尾,这相当于试图对Timer对象进行字符串格式化,而不是对命令字符串本身做格式化——Timer对象可不是字符串,这自然会触发TypeError。另外,args参数需要传递的是目标函数(这里是attacker.cmd)的参数列表,得确保参数传递的方式正确。
修复后的代码方案
这里提供两种可行的写法,你可以根据需求选择:
方案1:先格式化完整命令字符串再传递
这是最直观的方式,先把包含变量的命令字符串拼接好,再作为单个参数传给attacker.cmd:
import threading # 假设ips是你的IP字典,比如ips = {"192.168.1.1": 1000, ...} for ip in ips: # 先把命令字符串格式化完成 cmd_command = f"sudo python SYN-ACK.py {ip} 192.168.1.100 {ips[ip]} 80" # 创建定时器,args是包含格式化后命令的元组 t = threading.Timer(7, attacker.cmd, args=(cmd_command,)) t.start() # 一定要启动定时器,否则不会执行!
方案2:拆分参数传递(如果attacker.cmd支持多参数调用)
如果attacker.cmd可以接收多个独立参数(而不是单个完整命令字符串),你可以把每个参数分开传入:
import threading for ip in ips: t = threading.Timer( 7, attacker.cmd, args=( "sudo python SYN-ACK.py", ip, "192.168.1.100", str(ips[ip]), # 转换为字符串,确保命令参数格式正确 "80" ) ) t.start()
额外提醒
别忘了调用t.start()来启动定时器,否则你的定时任务永远不会被执行。另外,如果你需要循环多次发送命令(而不是每个IP只发一次),可能需要在目标函数里重新创建Timer来实现循环触发,因为threading.Timer是一次性的。
内容的提问来源于stack exchange,提问作者M.salameh
相关产品推荐
相关产品推荐

