Python 3.6.4虚拟环境无法导入自身site-packages包问题咨询
这种情况我之前在Windows上折腾虚拟环境时也碰到过——明明包已经装到虚拟环境的site-packages里了,pip freeze也能看到,就是导入报错,属实闹心。结合你的环境(Windows 10 64位、Python 3.6.4 64位),给你列几个最可能的原因和解决办法:
1. 先确认虚拟环境是不是真的“活”了
Windows下激活虚拟环境的命令很容易搞错:
- 如果用CMD,得执行
venv64\Scripts\activate.bat - 如果用PowerShell,要执行
venv64\Scripts\Activate.ps1(注意可能需要先设置执行权限)
激活成功后,命令行开头会显示 (venv64) 的标识。别光看标识,再验证下路径:
# 检查Python路径 where python # 检查pip路径 where pip
输出的路径必须是 venv64\Scripts\python.exe 和 venv64\Scripts\pip.exe,要是指向系统Python的话,说明激活没生效,等于白忙活。
2. 看看Python的模块搜索路径有没有包含虚拟环境的site-packages
激活虚拟环境后,执行这段代码,看看输出里有没有你的虚拟环境site-packages路径:
python -c "import sys; print('\n'.join(sys.path))"
正常情况下,应该能看到类似 venv64\Lib\site-packages 的路径。如果没有,说明Python根本没加载这个目录,自然找不到ujson。这种情况大概率是激活过程出了问题,或者系统的PYTHONPATH环境变量在捣乱。
3. 排查PYTHONPATH环境变量
如果系统里设置了PYTHONPATH,它会强制Python优先加载指定路径的模块,可能会跳过虚拟环境的site-packages。可以先临时清空它试试:
- CMD里执行:
set PYTHONPATH= - PowerShell里执行:
$env:PYTHONPATH = ""
清空后再尝试导入ujson,要是能成功,说明就是PYTHONPATH的锅,以后激活虚拟环境前记得先清空这个变量,或者调整它的优先级。
4. 重新创建虚拟环境试试
有时候创建虚拟环境时可能因为权限、路径特殊字符(比如路径里有中文或空格)导致异常,这种情况下虚拟环境本身就有问题。可以删掉旧的重新建:
# CMD里删除虚拟环境目录 rmdir /s venv64 # 用指定的Python版本重新创建(确保路径是你系统里的Python3.6.4) python -m venv venv64 # 激活后重装ujson venv64\Scripts\activate.bat pip install ujson
5. 检查虚拟环境的配置文件
打开虚拟环境根目录下的 pyvenv.cfg 文件,看看 include-system-site-packages 这一行的值是不是 false。如果是 true,说明这个虚拟环境继承了系统的site-packages(虽然这不应该导致自己装的包找不到,但也可以改成false后重新激活试试)。
一般来说,按上面的步骤排查,大概率能解决问题——最常见的还是激活没到位或者路径不对的问题。
内容的提问来源于stack exchange,提问作者Khushal Adlakha

