从另一个Python脚本运行Flask脚本时遇ModuleNotFoundError求助
Flask Module Not Found When Calling via subprocess (Works Directly in PyCharm)
这个问题的核心原因很明确:你用subprocess.call调用的Python解释器,和PyCharm右键运行app.py时使用的不是同一个环境。PyCharm默认会自动激活你项目配置的虚拟环境(比如venv),而直接用python命令调用时,系统会使用默认的全局Python解释器——这个全局环境里并没有安装Flask,所以才会抛出ModuleNotFoundError。
下面是几个针对性的解决方案:
1. 直接使用虚拟环境的Python解释器路径
最稳妥的办法是明确指定项目虚拟环境中的Python执行文件路径,而不是依赖系统默认的python命令。
假设你的项目虚拟环境放在项目根目录的venv文件夹下:
- Windows系统的路径通常是:
venv\Scripts\python.exe - Linux/macOS系统的路径通常是:
venv/bin/python
修改你的runner.py代码,替换python为这个具体路径:
import os import subprocess from your_module import Settings, get_driver_file_path # 构建虚拟环境的Python路径(根据你的系统调整) venv_python_path = os.path.join(Settings.TestProjectPath, "venv", "Scripts", "python.exe") # 如果你是Linux/macOS,替换成下面这行: # venv_python_path = os.path.join(Settings.TestProjectPath, "venv", "bin", "python") # 调用app.py时使用虚拟环境的Python subprocess.call([venv_python_path, get_driver_file_path(Settings.TestProjectPath)])
2. 传递当前环境变量给subprocess
当你在PyCharm中运行runner.py时,PyCharm已经帮你激活了项目的虚拟环境,对应的环境变量(比如PATH、PYTHONPATH)都指向了虚拟环境的资源。你可以把这个环境变量传递给subprocess,让它使用和当前进程相同的Python环境:
import os import subprocess from your_module import Settings, get_driver_file_path # 复制当前进程的环境变量(包含PyCharm激活的虚拟环境配置) current_env = os.environ.copy() # 调用时传入env参数 subprocess.call( ["python", get_driver_file_path(Settings.TestProjectPath)], env=current_env )
3. 验证环境差异(排查用)
如果你不确定问题出在哪,可以先在subprocess中打印Python的路径和包搜索路径,对比直接运行app.py时的输出:
在runner.py中添加这段测试代码:
import subprocess subprocess.call(["python", "-c", "import sys; print('Python路径:', sys.executable); print('包搜索路径:', sys.path)"])
然后对比PyCharm中直接运行app.py时,在代码开头添加的输出:
import sys print('Python路径:', sys.executable) print('包搜索路径:', sys.path)
两者的差异会直接告诉你为什么找不到Flask——大概率是Python解释器路径不同,或者sys.path里没有包含虚拟环境的site-packages目录。
内容的提问来源于stack exchange,提问作者David Tunnell
相关产品推荐
相关产品推荐

