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

Python虚拟环境已验证pip与执行文件,运行main.py仍报ModuleNotFoundError

虚拟环境中运行main.py调用子进程时出现ModuleNotFoundError,但单独运行文件正常

问题背景

  1. 操作流程:

    • 在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均正常
  2. 环境验证结果:

    • where.exe python指向虚拟环境路径:C:\[mypath]\.venv\Scripts\python.exe
    • python -m site输出的路径符合虚拟环境配置
    • python -m pip --version显示pip 24.0来自虚拟环境的site-packages
    • pip list确认所有依赖已安装
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:24:58