Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法

开发环境说明:

  • python 3.6.2
  • Vs studio 2017 (已经安装C++桌面开发)
  • Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法_第1张图片

 我的 vcvarsall.bat 路径为:

"D:\vsstudio\VC\Auxiliary\Build\vcvarsall.bat"

一般在Vs studio 的此安装路径下

Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法_第2张图片

  • 修改python源代码

修改文件为  python3.6.2\Lib\distutils\_msvccompiler.py 注意 前面存在下划线 :

我的文件路径为:

"D:\core_package\python3.6.2\Lib\distutils\_msvccompiler.py"

Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法_第3张图片

接下来 使用记事本打开:

  •  将 _find_vcvarsall 函数修改:
  • 源代码:
  • def _find_vcvarsall(plat_spec):
        try:
            key = winreg.OpenKeyEx(
                winreg.HKEY_LOCAL_MACHINE,
                r"Software\Microsoft\VisualStudio\SxS\VC7",
                access=winreg.KEY_READ | winreg.KEY_WOW64_32KEY
            )
        except OSError:
            log.debug("Visual C++ is not registered")
            return None, None
     
        with key:
            best_version = 0
            best_dir = None
            for i in count():
                try:
                    v, vc_dir, vt = winreg.EnumValue(key, i)
                except OSError:
                    break
                if v and vt == winreg.REG_SZ and os.path.isdir(vc_dir):
                    try:
                        version = int(float(v))
                    except (ValueError, TypeError):
                        continue
                    if version >= 14 and version > best_version:
                        best_version, best_dir = version, vc_dir
            if not best_version:
                log.debug("No suitable Visual C++ version found")
                return None, None
     
            vcvarsall = os.path.join(best_dir, "vcvarsall.bat")
            if not os.path.isfile(vcvarsall):
                log.debug("%s cannot be found", vcvarsall)
                return None, None
     
            vcruntime = None
            vcruntime_spec = _VCVARS_PLAT_TO_VCRUNTIME_REDIST.get(plat_spec)
            if vcruntime_spec:
                vcruntime = os.path.join(best_dir,
                    vcruntime_spec.format(best_version))
                if not os.path.isfile(vcruntime):
                    log.debug("%s cannot be found", vcruntime)
                    vcruntime = None
     
            return vcvarsall, vcruntime

    修改为:

  • def _find_vcvarsall(plat_spec):
        best_dir = r"D:\vsstudio\VC\Auxiliary\Build"
        best_version = 17
        vcruntime = None
        vcruntime_spec = _VCVARS_PLAT_TO_VCRUNTIME_REDIST.get(plat_spec)
        if vcruntime_spec:
            vcruntime = os.path.join(best_dir,
                                     vcruntime_spec.format(best_version))
            if not os.path.isfile(vcruntime):
                log.debug("%s cannot be found", vcruntime)
                vcruntime = None
        print(vcruntime)
        return r"D:\vsstudio\VC\Auxiliary\Build\vcvarsall.bat", vcruntime

    要修改的 如下图所示:

Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法_第4张图片

 如果跟我配置一样的话 到指定目录终端下

就可以输入

python setup.py build_ext --inplace

 完成 PYTHON 到 c 的文件编译啦

成功截图 如下所示:

Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法_第5张图片

 

注意 编译完成后要使用时 需要将 .pyx文件 .c文件 .py文件全部删除 只保留 pyd文件

在其他文件调用时 不用担心报错 可以正常运行

Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法_第6张图片

 

输出结果如下所示

Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法_第7张图片

.

 

你可能感兴趣的:(windows)