Windows下Anaconda Python启动崩溃,错误调用WinPython模块路径
多Python版本冲突问题原因解析
问题背景
本地安装了两个Python版本:
- Anaconda 搭载的 Python 3.6.5,路径:
C:\Users\Pedro\AppData\Local\Continuum\anaconda3\python.exe - WinPython 搭载的 Python 3.8.5,路径:
C:\Users\Pedro\Documents\Softwares\Winpython.385\python-3.8.5.amd64\python.exe
双击WinPython的python.exe可正常运行,但双击Anaconda的python.exe时程序崩溃,报错信息如下:
python.exe : Fatal Python error: Py_Initialize: can't initialize sys standard streams Traceback (most recent call last): File "C:\Users\Pedro\Documents\Softwares\Winpython.385\python-3.8.5.amd64\Lib\abc.py", line 64, in <module> ModuleNotFoundError: No module named '_abc'
注:WinPython路径未添加到shell环境变量,但Anaconda Python会去WinPython文件夹查找模块,删除WinPython文件夹后Anaconda Python恢复正常。
核心原因
1. Python模块搜索路径被异常植入WinPython路径
Python启动时会通过sys.path列表查找模块,即便WinPython不在系统环境变量中,仍有几种途径导致其路径被加入Anaconda Python的搜索列表:
PYTHONPATH环境变量:若全局或用户级环境变量中设置了PYTHONPATH并指向WinPython的Lib目录,Python启动时会优先加载该变量指定的路径,导致Anaconda的Python错误地去WinPython目录找模块。- 启动脚本篡改:用户目录(
C:\Users\Pedro)下若存在sitecustomize.py或usercustomize.py文件,这两个文件会在Python启动时自动执行,若文件内有代码将WinPython路径添加到sys.path,就会引发路径混乱。 - 注册表残留配置:WinPython安装或卸载过程中,可能在Windows注册表的
HKEY_CURRENT_USER\Software\Python或HKEY_LOCAL_MACHINE\Software\Python项中留下了路径配置,Anaconda的Python启动时会读取这些注册表项,从而加载错误的模块路径。
2. 跨版本模块不兼容引发致命错误
_abc是Python的内置C扩展模块,不同大版本的Python(3.6 vs 3.8)对应的_abc模块二进制完全不兼容。当Anaconda的Python3.6.5错误加载WinPython3.8.5的abc.py文件时,该文件依赖的是3.8版本的_abc模块,而Anaconda的Python3.6无法识别这个模块,直接触发ModuleNotFoundError,进而导致Python初始化系统标准流失败,最终引发致命启动错误。
内容的提问来源于stack exchange,提问作者floupinette
相关产品推荐
相关产品推荐

