创建Python3虚拟环境失败问题跟进

0x00 问题描述

今天在Win10上遇到一个很诡异的问题,使用python3的virtualenv创建虚拟环境失败,报错如下:

Using base prefix 'c:\\users\\xxx\\appdata\\local\\programs\\python\\python37'
New python executable in D:\env\Scripts\python3.exe
Also creating executable in D:\env\Scripts\python.exe
ERROR: The executable D:\env\Scripts\python3.exe is not functioning
ERROR: It thinks sys.prefix is 'd:\\' (should be 'd:\\env')
ERROR: virtualenv is not compatible with this system or executable
Note: some Windows users have reported this error when they installed Python for "Only this user" or have multiple versions of Python installed. Copying the appropriate PythonXX.dll to the virtualenv Scripts/ directory may fix this problem.

同时还会有如下弹窗:

定位原因

根据错误信息在网上寻找解决方法,有说是pythonxx.dll有问题,还有说是权限问题,但试了下都没法解决这个问题。因此,只能尝试在本地寻找复现规律。

发现将python3.exe复制到其它路径后都无法运行,报错与创建虚拟环境一致;而在另一台Win10机器上却没有这个问题。所以,看来原因应该是python环境有问题,但为什么默认路径运行却是正常的呢?

一开始以为是python37.dll的问题,但是很快又排除了。此时,发现python3安装目录下有个vcruntime140.dll文件,而这个文件是不会被复制到虚拟环境中的,难道是这个dll的问题?

将这个dll拷贝到虚拟环境目录后,果然python可以正常运行了。

因此确定,就是vcruntime140.dll这个文件的锅了。

终极解决方案

但是其它Win10上没有拷贝这个dll,也是正常的啊。所以,还需要进一步寻找原因。

接着,将正常电脑上python安装目录里的vcruntime140.dll文件删掉,运行python,也是正常的。使用procexp查看加载的dll,发现原来python会从C:\Windows\system32目录下加载该dll。

在有问题的电脑上看了下该目录,文件也是存在的啊,那是怎么回事呢?

右键查看文件属性,终于发现了根本原因,原来文件的权限设置有问题,估计这个dll是在入域前装上去的,导致只能在管理员权限下访问。

修改文件权限后,一切都正常了。

总结

根据程序的报错信息不一定能正确地找到解决问题的方法,有时还是需要进一步跟踪调试,才能找到问题的真正原因。

分享