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

Python Flask应用导入冲突:直接运行与导入无法同时正常工作

Flask应用与模块直接运行的导入冲突解决思路

问题背景

项目文件结构:

run.py
.flaskenv
requirements.txt
/app
| - __init__.py
| - bot.py
| - /strategies
    | - __init__.py
    | - strategy1.py

核心代码片段:

  • run.py:
from flask import Flask
from app.bot import test_func
...
  • bot.py初始代码:
import strategies as st

strategy = st.Strat1
...
def test_func():
    pass
  • strategies/init.py:
from .strategy1 import Strat1

问题现象

  • 直接运行bot.py时完全正常
  • 启动Flask应用时抛出ModuleNotFoundError: No module named 'strategies'
  • 修改导入为from .strategies import *后:
    • Flask运行恢复正常
    • 直接运行bot.py时抛出ImportError: attempted relative import with no known parent package

解决思路

思路1:统一以项目根目录为执行入口

所有运行操作都从项目根目录发起:

  • 启动Flask:保持原有方式即可(run.py在根目录,会自动将app识别为包)
  • 单独测试bot.py时,使用模块调用命令:
    python -m app.bot
    
    这种方式会把项目根目录加入Python模块搜索路径,此时bot.py中使用from .strategies import Strat1的相对导入,就能同时兼容两种运行场景。

思路2:动态调整模块搜索路径(兜底方案)

在bot.py开头添加代码,确保两种运行场景下都能找到strategies模块:

import os
import sys
# 将当前文件所在的app目录加入模块搜索路径
current_dir = os.path.dirname(os.path.abspath(__file__))
if current_dir not in sys.path:
    sys.path.append(current_dir)

from strategies import Strat1

思路3:根据运行场景切换导入逻辑

通过判断模块是否为入口文件,动态选择导入方式:

if __name__ == "__main__":
    # 直接运行bot.py时,使用同级包导入
    import strategies as st
else:
    # 被Flask导入时,使用相对导入
    from . import strategies as st

strategy = st.Strat1
...
def test_func():
    pass

内容的提问来源于stack exchange,提问作者Franco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:11:08