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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:54:23