网络编程
位置:首页>> 网络编程>> Python编程>> Windows11使用Cpython 编译文件报错 error: Unable to find vcvarsall.bat 完美解决方法

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

作者:清虞  发布时间:2021-03-14 19:03:19 

标签:Cpython,编译文件,报错

开发环境说明:

  • python 3.6.2

  • Vs studio 2017 (已经安装C++桌面开发)

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

我的vcvarsall.bat 路径为:

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

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

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

修改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 完美解决方法

接下来 使用记事本打开:

  • 将_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 完美解决方法

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

就可以输入

python setup.py build_ext --inplace

完成 PYTHON 到 c 的文件编译啦

成功截图 如下所示:

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

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

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

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

输出结果如下所示

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

来源:https://blog.csdn.net/qq_43647590/article/details/130618279

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com