如何修改Python Slack Bolt Socket Mode代码实现自动重载
问题原因
你用uvicorn失效的核心原因是:Slack Bolt的App实例并非ASGI应用,SocketModeHandler是独立的WebSocket事件循环启动器,而uvicorn是用来运行FastAPI、Starlette这类ASGI服务的工具,两者运行逻辑完全不匹配,自然无法触发斜杠命令。
替代自动重载方案
方案1:用watchdog编写监控脚本
watchdog是Python的文件系统监控库,可以轻松实现文件变更后重启进程。
- 安装依赖:
pip install watchdog
- 创建
reload.py脚本:
import subprocess import sys from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class CodeReloader(FileSystemEventHandler): def __init__(self): self.process = self._start_app() def _start_app(self): print("Starting Slack Socket Mode app...") return subprocess.Popen([sys.executable, "main.py"]) def on_modified(self, event): # 只监控Python文件变更 if not event.is_directory and event.src_path.endswith(".py"): print(f"File changed: {event.src_path}") print("Restarting app...") self.process.kill() self.process = self._start_app() if __name__ == "__main__": event_handler = CodeReloader() observer = Observer() # 监控当前目录下所有文件变化 observer.schedule(event_handler, path=".", recursive=True) observer.start() try: while True: pass except KeyboardInterrupt: print("Stopping reloader...") observer.stop() observer.join()
- 运行脚本:
python reload.py
修改main.py或其他Python文件后,进程会自动重启,斜杠命令可以正常触发。
方案2:用entr命令行工具(Linux/macOS)
如果不想写Python脚本,可以用轻量命令行工具entr,直接监控文件变化并重启进程。
- 安装entr:
- macOS:
brew install entr - Debian/Ubuntu:
sudo apt install entr - RHEL/CentOS:
sudo yum install entr
- 运行监控命令:
find . -name "*.py" | entr -r python main.py
这条命令会监控当前目录下所有Python文件,一旦文件修改,自动重启main.py进程。
方案3:结合python-dotenv的增强版(可选)
如果你的项目用了环境变量管理,可以结合python-dotenv,在重启时自动加载最新的环境变量:
修改reload.py中的_start_app方法:
import os def _start_app(self): print("Starting Slack Socket Mode app...") # 加载.env文件的环境变量 env = os.environ.copy() try: from dotenv import load_dotenv load_dotenv() env.update(os.environ) except ImportError: pass return subprocess.Popen([sys.executable, "main.py"], env=env)
需要先安装依赖:pip install python-dotenv
内容的提问来源于stack exchange,提问作者vinod827
相关产品推荐
相关产品推荐

