Python虚拟环境已验证pip与执行文件,运行main.py仍报ModuleNotFoundError
虚拟环境中运行main.py调用子进程时出现ModuleNotFoundError,但单独运行文件正常
问题背景
操作流程:
- 在PowerShell进入项目目录,执行
python -m venv .venv创建虚拟环境,通过.venv/Scripts/activate激活 - 激活后执行
pip install -r requirements.txt,手动解决了requirements.txt的内部冲突(冲突模块与后续报错无关),所有依赖安装成功 - 运行
python -u main.py时触发多个ModuleNotFoundError,但单独运行file1.py、file2.py、file3.py均正常
- 在PowerShell进入项目目录,执行
环境验证结果:
where.exe python指向虚拟环境路径:C:\[mypath]\.venv\Scripts\python.exepython -m site输出的路径符合虚拟环境配置python -m pip --version显示pip 24.0来自虚拟环境的site-packagespip list确认所有依赖已安装
main.py代码:
import subprocess files_to_run = [ 'file1.py', 'file2.py', 'file3.py' ] for file in files_to_run: subprocess.run(['python', file])
问题原因
激活虚拟环境仅修改了当前PowerShell会话的PATH环境变量,但subprocess.run启动的子进程默认可能未正确继承当前会话的PATH,导致调用的python是系统全局Python而非虚拟环境内的Python,因此找不到安装在虚拟环境site-packages中的依赖。而单独运行文件时,当前Shell已激活虚拟环境,直接使用的是虚拟环境的Python,所以无报错。
解决方案
方案1:使用当前进程的Python路径(推荐)
修改main.py,通过sys.executable获取当前运行main.py的Python路径,确保子进程使用同一虚拟环境的Python:
import subprocess import sys files_to_run = [ 'file1.py', 'file2.py', 'file3.py' ] for file in files_to_run: subprocess.run([sys.executable, file])
方案2:传递当前环境变量给子进程
让子进程继承当前Shell的环境变量(包含虚拟环境的PATH):
import subprocess import os files_to_run = [ 'file1.py', 'file2.py', 'file3.py' ] for file in files_to_run: subprocess.run(['python', file], env=os.environ.copy())
方案3:直接指定虚拟环境Python的绝对路径
如果上述方法无效,可直接写入虚拟环境Python的绝对路径:
import subprocess files_to_run = [ 'file1.py', 'file2.py', 'file3.py' ] # 替换为你的虚拟环境Python路径 venv_python = r'C:\[mypath]\.venv\Scripts\python.exe' for file in files_to_run: subprocess.run([venv_python, file])
内容的提问来源于stack exchange,提问作者JustifiedBecause
相关产品推荐
相关产品推荐

