RHEL 8.6中创建venv后为何出现“Module not found”?
问题:Python venv未加
--system-site-packages时无法导入系统包,但pip list显示包存在 环境与问题现象
- 运行环境:RHEL 8.6,Python 3.6.8,无root权限,无法修改Python版本、增删模块,仅存在单一系统Python实例
- 未激活虚拟环境时:执行
pip3 list能看到requests、werkzeug等包,且可正常导入使用 - 创建并激活venv后:
- 执行
python3 -m venv .pvenv创建虚拟环境,通过source .pvenv/bin/activate激活 - 激活后执行
pip3 list,显示的包列表与系统Python完全一致 - 但执行
python3尝试导入requests等包时,提示ModuleNotFoundError
- 执行
- 补充测试:使用
python3 -m venv --system-site-packages .pvenv创建的venv可正常导入系统包,但不符合无该选项时的隔离预期
解决方案与原因分析
原因
Python 3.6的venv在RHEL这类系统中,可能存在pip识别路径与Python实际导入路径不匹配的情况:系统通过rpm等方式安装的包,其路径被venv的隔离机制排除,但pip仍能读取系统的包元数据,导致pip list显示存在包,但Python运行时找不到对应的模块文件。
解决方法
手动将系统site-packages路径添加到venv的Python搜索路径中,既保留venv的隔离性(新安装的包仅存于venv),又能使用系统已有的包:
- 获取系统site-packages路径:在未激活venv的状态下执行:
会输出类似python3 -c "import site; print(site.getsitepackages())"['/usr/lib/python3.6/site-packages']的路径(以实际输出为准) - 在venv中添加路径配置:激活venv后,执行以下命令(替换为上一步得到的路径):
echo "/usr/lib/python3.6/site-packages" > .pvenv/lib/python3.6/site-packages/system-packages.pth - 验证:激活venv后执行:
若正常输出版本号,说明问题解决python3 -c "import requests; print(requests.__version__)"
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

