| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import os
- import sys
- import webbrowser
- from waitress import serve
- def _load_dotenv_if_exists():
-
- try:
- from dotenv import load_dotenv
- except Exception:
- return
- exe_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
- for name in ("config.env",):
- env_path = os.path.join(exe_dir, name)
- if os.path.exists(env_path):
- load_dotenv(env_path, override=True)
- break
- def main():
- _load_dotenv_if_exists()
- # 注意:必须在加载 config.env 之后再导入 app.py
- # 否则 app.py 顶层读取环境变量(DB/AI 等)时拿不到最新配置
- import app as webapp
- host = os.getenv("WEB_HOST", "127.0.0.1")
- port = int(os.getenv("WEB_PORT", "5000"))
- # 打开浏览器(只在本机访问时打开)
- if host in ("127.0.0.1", "localhost"):
- try:
- webbrowser.open(f"http://127.0.0.1:{port}", new=1)
- except Exception:
- pass
- # 正式服务(比 Flask debug 更稳定)
- try:
- serve(webapp.app, host=host, port=port, threads=8)
- except KeyboardInterrupt:
- print("\n服务已停止")
- except OSError as e:
- if "Address already in use" in str(e) or "只允许使用一次" in str(e):
- print(f"端口 {port} 已被占用,请修改 config.env 中的 WEB_PORT")
- else:
- print(f"服务启动失败: {e}")
- import traceback
- traceback.print_exc()
- except Exception as e:
- print(f"服务启动失败: {e}")
- import traceback
- traceback.print_exc()
- except KeyboardInterrupt:
- print("\n\n服务已停止")
- except OSError as e:
- if "Address already in use" in str(e) or "只允许使用一次" in str(e):
- print(f"\n\n✗ 端口 {port} 已被占用!")
- print(f" 请检查是否有其他程序在使用该端口")
- print(f" 或修改 config.env 中的 WEB_PORT 为其他端口(如 8080)")
- else:
- print(f"\n\n✗ 服务启动失败: {e}")
- import traceback
- traceback.print_exc()
- except Exception as e:
- print(f"\n\n✗ 服务启动失败: {e}")
- import traceback
- traceback.print_exc()
- if __name__ == "__main__":
- main()
|