最近Python装包的时候又遇到了需要编译的C包,然后之前我的Visual Studio的安装环境炸了导致Visual Studio Installer找不到已经安装并且可以正常使用的Visual Studio。
因为Visual Studio的安装、添加模块、卸载、修复等操作都会调用Installer,所以如果Installer检测不到已经安装的Visual Studio这些操作都无法完成!
众所周知这是一个十分庞大的软件,我不想拿第三方工具完全卸载再重装,于是我开始探索为什么会出现这个报错。
我安的包使用了setuptools进行安装,所以玄机很有可能就藏在这里面。很巧,setuptools里面刚好有一个msvc.py文件,里面刚好有这条报错的提示。69.5.1版本的在264行左右。
def _augment_exception(exc, version, arch=''): """ Add details to the exception message to help guide the user as to what action will resolve it. """ # Error if MSVC++ directory not found or environment not set message = exc.args[0] if "vcvarsall" in message.lower() or "visual c" in message.lower(): # Special error message if MSVC++ not installed tmpl = 'Microsoft Visual C++ {version:0.1f} or greater is required.' message = tmpl.format(**locals()) msdownload = 'www.microsoft.com/download/details.aspx?id=%d' if version == 9.0: if arch.lower().find('ia64') > -1: # For VC++ 9.0, if IA64 support is needed, redirect user # to Windows SDK 7.0. # Note: No download link available from Microsoft. message += ' Get it with "Microsoft Windows SDK 7.0"' else: # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : # This redirection link is maintained by Microsoft. # Contact vspython@microsoft.com if it needs updating. message += ' Get it from http://aka.ms/vcpython27' elif version == 10.0: # For VC++ 10.0 Redirect user to Windows SDK 7.1 message += ' Get it with "Microsoft Windows SDK 7.1": ' message += msdownload % 8279 elif version >= 14.0: # For VC++ 14.X Redirect user to latest Visual C++ Build Tools message += ( ' Get it with "Microsoft C++ Build Tools": ' r'https://visualstudio.microsoft.com' r'/visual-cpp-build-tools/' ) exc.args = (message,)
可以看到这就是报错的来源。
但是怎么确定是谁调用了这个函数的呢?
首先我print了最开始他用于判断错误的message,发现是Unable to find vcvarsall.bat。
我又导入了inspect模块来查看函数调用堆栈,发现恰好是上面一个函数msvc14_get_vc_env
而msvc14_get_vc_env又调用了_msvc14_get_vc_env,恰好也在上面。
然后刚好刚才的错误信息Unable to find vcvarsall.bat也在这里,说明是_msvc14_find_vcvarsall返回的vcvarsall是None
在_msvc14_find_vcvarsall中打印了一下best_dir发现也是None,说明_msvc14_find_vc2017获取best_dir失败了
在_msvc14_find_vc2017终于水落石出。大概在73行左右。
这个函数里执行了一个命令vswhere.exe -latest -prerelease -requires "Microsoft.VisualStudio.Component.VC.Tools.x86.x64" -property installationPath -products *
他是调用Visual Studio Installer里面的一个vswhere.exe来查找已经安装的Visual Studio路径的!
正常情况下调用这个查找路径会返回C:\Program Files\Microsoft Visual Studio\2022\Community这种路径,但是Installer自己都找不到已经安装的VS,更别提别的软件拿他找了!
那解决方法就很简单了,一个是改setuotools的msvc.py文件,把103行左右刚从vswhere.exe获取的空路径path替换成你的实际路径。当然这还是不太方便,包一更新或者换版本就寄了。
还可以直接替换掉原来的vswhere.exe,反正之前都找不到,现在不如直接让他无论怎么样都直接返回你的实际路径,C语言写一个printf("路径")编译成exe替换进去得了。
Microsoft Windows [版本 10.0.19045.4291] (c) Microsoft Corporation。保留所有权利。 C:\Program Files (x86)\Microsoft Visual Studio\Installer>vswhere.exe C:\Program Files\Microsoft Visual Studio\2022\Community C:\Program Files (x86)\Microsoft Visual Studio\Installer>
#include<iostream>
using namespace std;
int main()
{
printf("C:\\Program Files\\Microsoft Visual Studio\\2022\\Community");
return 0;
}
本文地址:https://blog.jixiaob.cn/?post=114
版权声明:若无注明,本文皆为“赵苦瓜のBlog~”原创,转载请保留文章出处。
- 【日常】瞎解包原神文件记录
- 【日常】不稳定的OneIndex文件系统——经常变为空白
- 已经安装了Visual Studio但是仍然报错Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
- 原神H5网页活动页面背景音频提取教程
- 论文免费查重网站推荐
- HIMEHINA XmasLive「Holy Travel」音乐纯享版
- 【日常】使用诱骗线让充电宝给宿舍的光猫供电 - 宿舍断电不断网!
- 瞎解包碧蓝档案的记录
- 【转载】BV号和av号互转(字典转换)
- 滕州一中2020届(2017级)10班毕业去向分布图