我碰到的问题和这位老哥很像Anaconda卸载重装后出现问题,请问如何解决--CSDN问答,真是同是天涯沦落人啊。图片说明

我之前用的anaconda2,后来因为其他原因需要使用anaconda3,当我卸载掉anaconda2的时候发现,安装anaconda3出现问题了。这个问题后来查询百度,基本上都是failed to create anacoda menu。无法生成anaconda 快捷方式。或者UnicodeEncodeError这样的编码问题,我试了一下他们的办法发现不能解决我的问题。

为了解决问题,只好通过他的错误信息逐个查找了,我查询了安装日志,发现安装包解压之后,主要运行了一下命令;

pythonw.exe -E -s d:\ProgramData\Anaconda3\Lib\_nsis.py mkmenus 

pythonw.exe -E -s d:\ProgramData\Anaconda3\Lib\_nsis.py mkdirs

pythonw.exe -E -s d:\ProgramData\Anaconda3\Lib\_nsis.py post_install

于是根据提示找到_nsis.py这个文件,看看安装流程的逻辑,还好也是python代码所以也大概能看得懂。

我这里是在参数post_install的时候报了错。看了安装流程的代码其中是在subprocess.py里面有问题。我当时觉得可能是anaconda2安装的时候改变了系统环境,导致文件找不到,然后我试着在安装anaconda2,发现anaconda2也安装不上了,这就没有退路了,只好硬着头皮再看subprocess.py里面做了什么东西。

根据提示,找到错误的地方,发现错误的代码主要是用了_subprocess模块创建新的进程。

hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
                                         # no special security
                                         None, None,
                                         int(not close_fds),
                                         creationflags,
                                         env,
                                         os.fspath(cwd) if cwd is not None else None,
                                         startupinfo)

我看了上面这个代码,觉得应该是startupinfo这项出了问题,然后代码里面发现没有地方修改了startupinfo这个类,打印了里面的项发现确实和初始的没有什么区别。后面查了资料看看_winapi.CreateProcess这个函数的用法,发现args那一项才是需要添加的进程,和startupinfo无关,然后我在上述安装进程之前,添加了一句代码print(args),打印了args,看看他是什么命令,如下图所示:

 终于发现问题在哪里了,要执行的args的形式明显不对,

​C:\Windows\system32\cmd.exe;C:\Windows\System32 /c D:\ProgramData\Anaconda2\pkgs\post_install.bat

看这个命令的本意应该是使用cmd运行post_install.bat脚本,形式应该如下所示

​C:\Windows\system32\cmd.exe /c D:\ProgramData\Anaconda2\pkgs\post_install.bat

本来要调用C:/system32/cmd.exe的,结果还把C:/Windows/System32加进去了,导致的命令不对。一看感觉是%ComSpec%环境变量,然后echo %COMSPEC%一看,果然是这里有问题,环境变量不知道什么时候多了一个C:/Windows/System32,然后我把%ComSpec%环境变量改成C:/system32/cmd.exe,运行了一下命令发现没有报错了。然后再重新装了一下就没有问题了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐