如何通过Python程序启动多个Telegram机器人?模块导入错误求助
问题解决:ModuleNotFoundError: No module named 'create_bot'
核心原因
从项目根目录的main.py启动时,Python的模块搜索路径以根目录为基准,BOT1内部的模块导入未使用正确路径,导致无法找到同目录下的create_bot.py。
解决方案
1. 用相对导入修正内部模块引用
修改BOT1/bot.py中的导入语句,改用相对导入引用同目录模块:
import asyncio from . import handlers # 相对导入同目录的handlers from .create_bot import dp # 相对导入同目录create_bot里的dp async def main(): handlers.register_handlers(dp) #admin.register_handlers(dp) await dp.start_polling() def run(): # 为子线程创建独立事件循环,避免多线程asyncio冲突 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(main())
2. 修正线程启动的错误写法
原main.py中target=bot1.run()会直接在主线程执行run()函数,线程并未真正异步运行,需去掉括号,将函数对象传给target:
import threading import asyncio from main_bots.BOT1 import bot as bot1 from main_bots.BOT2 import bot as bot2 from main_bots.BOT3 import bot as bot3 if __name__ == '__main__': # 创建三个线程分别运行机器人 t1 = threading.Thread(target=bot1.run) t2 = threading.Thread(target=bot2.run) t3 = threading.Thread(target=bot3.run) t1.start() t2.start() t3.start() # 等待所有线程结束 t1.join() t2.join() t3.join()
3. 确保目录的包合法性
检查main_bots/、BOT1/、BOT2/、BOT3/目录下是否存在__init__.py文件(空文件即可),这是Python识别包的必要条件。
额外注意事项
- 每个线程必须拥有独立的asyncio事件循环,否则多机器人的异步任务会出现冲突,这也是修改
run()函数的原因。 - 若后续要开发主机器人监控子进程,建议用
subprocess启动独立进程而非线程,进程隔离性更好,更便于监控和重启。
内容的提问来源于stack exchange,提问作者john_psina
相关产品推荐
相关产品推荐

