设置cl.exe环境变量[通俗易懂]

(173) 2023-06-13 19:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说设置cl.exe环境变量[通俗易懂],希望能够帮助你!!!。

ninja
ninja

pip install ninja
 

先给出两个报错的内容:
d:\Anaconda3\envs\torch\lib\site-packages\torch\utils\cpp_extension.py:189: UserWarning: Error checking compiler version for cl: [WinError 2] 系统找不到指定的文件。

d:\Anaconda3\envs\torch\lib\site-packages\torch\utils\cpp_extension.py:189: UserWarning: Error checking compiler version for cl: 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte

考:https://blog.csdn.net/tanmx219/article/details/100829920

问题一:

C:\Users\pc-01\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\utils\cpp_extension.py:287: UserWarning: Error checking compiler version for cl: 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte
  warnings.warn('Error checking compiler version for {}: {}'.format(compiler, error))
1
2
utf-8的问题,找到报错目录cpp_extension.py的对应代码位置:

也就是283行re.search这里出了问题,把原来的:

match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode().strip())
1
改成

match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode(' gbk').strip())
1
究其原因可能是visual studio的那个cl,原来输出是英文的,直接utf-8解码没问题,新版更加“人性化”的能输出中文,然后pytorch这里没改还是utf-8…所以让pytorch按gbk解码就好

问题二:

Traceback (most recent call last):
  File "C:\Users\pc-01\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\utils\cpp_extension.py", line 1539, in _run_ninja_build
    env=env)
  File "C:\Users\pc-01\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 512, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['ninja', '-v']' returned non-zero exit status 1.
1
2
3
4
5
6
还是这个cpp_extension.py,找到对应位置:

也就是这个_run_ninja_build方法,把下面这个

command = ['ninja', '-v']
1
改成

command = ['ninja','--v']
1
或者

command = ['ninja','--version']
1
好像只有一种改法有效,大概率为后者。这个东西的作用其实单纯就是指定build.ninja文件的第一行输出:

————————————————
版权声明:本文为CSDN博主「xiongxyowo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40714949/article/details/116571010

解决方案:
打开cpp_extension.py,把编码改成' gbk',下面我注释掉了原来的一行(match...),添加了两个print用来追踪。

try:
        if sys.platform.startswith('linux'):
            minimum_required_version = MINIMUM_GCC_VERSION
            version = subprocess.check_output([compiler, '-dumpfullversion', '-dumpversion'])
            version = version.decode().strip().split('.')
        else:
            print("----windows operation system")
            minimum_required_version = MINIMUM_MSVC_VERSION
            compiler_info = subprocess.check_output(compiler, stderr=subprocess.STDOUT)
            # the default decode is 'utf8', since cl.exe will return Chinese, so ' gbk'
            #match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode().strip())
            print("----compiler_info: ", compiler_info.decode(' gbk'))
            match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode(' gbk').strip())
            print("----match: ", match)
            version = (0, 0, 0) if match is None else match.groups()
    except Exception:
        _, error, _ = sys.exc_info()
        warnings.warn('Error checking compiler version for {}: {}'.format(compiler, error))
        return False

问题的起源与解决过程:
原来的maskRCNN太久远,已经忘记是什么时候的事了,这次更新了pytorch,要重新编译。本来是想升级到pytorch1.2,但报错了。于是再回到pytorch1.0.1。还是原来的facebook/maskrcnn-benchmark,该项目原来就成功编译过,再编译应该是不会出问题的,命令很简单,

(torch) D:\maskrcnn-benchmark>python setup.py build develop
#结果报错
d:\Anaconda3\envs\torch\lib\site-packages\torch\utils\cpp_extension.py:189: UserWarning: Error checking compiler version for cl: [WinError 2] 系统找不到指定的文件。
  warnings.warn('Error checking compiler version for {}: {}'.format(compiler, error))
OK,找不到cl.exe是吧,那我call一个,预设一下环境

(torch) D:\maskrcnn-benchmark>call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.6
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
补充说明:如果你用vs2019,那就用下面这条:

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat",通常检查一下,如果输出的不是中文,你就不会有gbk和utf-8冲突的问题了。

再来一次python setup.py build develop,就会出现第二条报错(注意我这里已经添加了两条追踪命令print("----windows operation system"),print("----compiler_info: ", compiler_info)),

(torch10) E:\AMaskRCNN\maskrcnn-benchmark>python setup.py build develop
running build
running build_py
running build_ext
----windows operation system
----compiler_info:  b'\xd3\xc3\xd3\xda x64 \xb5\xc4 Microsoft (R) C/C++ \xd3\xc5\xbb\xaf\xb1\xe0\xd2\xeb\xc6\xf7 19.16.27026.1 \xb0\xe6\r\n\xb0\xe6\xc8\xa8\xcb\xf9\xd3\xd0(C) Microsoft Corporation\xa1\xa3\xb1\xa3\xc1\xf4\xcb\xf9\xd3\xd0\xc8\xa8\xc0\xfb\xa1\xa3\r\n\r\n\xd3\xc3\xb7\xa8: cl [ \xd1\xa1\xcf\xee... ] \xce\xc4\xbc\xfe\xc3\xfb... [ /link \xc1\xb4\xbd\xd3\xd1\xa1\xcf\xee... ]\r\n'
d:\Anaconda3\envs\torch10\lib\site-packages\torch\utils\cpp_extension.py:188: UserWarning: Error checking compiler version for cl: 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte
  warnings.warn('Error checking compiler version for {}: {}'.format(compiler, error))
看着这些乱码就头皮发麻,注意compiler_info得到的是compiler的输出结果,subprocess.check_output只不过对compiler进行了一次空的执行(参考python源码:如,Python-3.7.4\Lib\subprocess.py第351行),

compiler_info = subprocess.check_output(compiler, stderr=subprocess.STDOUT)

于是我直接运行了一下cl.exe,看看这个输出结果到底是什么玩意,

(torch10) E:\AMaskRCNN\maskrcnn-benchmark>cl
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.16.27026.1 版
版权所有(C) Microsoft Corporation。保留所有权利。

用法: cl [ 选项... ] 文件名... [ /link 链接选项... ]
那么现在一目了然,这些中文就是上面对应的字符串,使用utf-8编码时是认不出来的,而python默认的情况下使用的正是utf-8。搞不懂微软啥时把这个cl.exe的运行输出也中文化了,唉,悲催。

b'\xd3\xc3\xd3\xda x64 \xb5\xc4 Microsoft (R) C/C++ \xd3\xc5\xbb\xaf\xb1\xe0\xd2\xeb\xc6\xf7 19.16.27026.1 \xb0\xe6\r\n\xb0\xe6\xc8\xa8\xcb\xf9\xd3\xd0(C) Microsoft Corporation\xa1\xa3\xb1\xa3\xc1\xf4\xcb\xf9\xd3\xd0\xc8\xa8\xc0\xfb\xa1\xa3\r\n\r\n\xd3\xc3\xb7\xa8: cl [ \xd1\xa1\xcf\xee... ] \xce\xc4\xbc\xfe\xc3\xfb... [ /link \xc1\xb4\xbd\xd3\xd1\xa1\xcf\xee... ]\r\n' 
现在问题明白了,要正确识别compiler,就必须使用' gbk'编码,也就是我前面给出的解决方案。

当然,如果你换系统了,在采用utf8的情况下,别忘记改回来。

关于pytorch1.2的额外问题
上面的内容即适用于pytorch1.0.1也适用于pytorch1.20,不过新版本的pytorch1.20有更多的麻烦,最主要的是,老的配置文件不能用了(当然如果你够熟悉,直接改),要用新的配置文件,同时你会发现新版本的maskRCNN有不少函数也已经发生了变化。

还有一处要格外注意,

  File "e:\maskrcnn-benchmark\maskrcnn_benchmark\layers\nms.py", line 5, in <module>
    from apex import amp

ModuleNotFoundError: No module named 'apex'

需要安装apex,注意在windows下要到这里去下载,

https://github.com/ptrblck/apex/tree/apex_no_distributed

linux则要到这里下载,

https://github.com/NVIDIA/apex

安装完成后,顺利的话就可以正常运行了。

后记:
办法一
VS编译器换成中文版的以后,可以想像这个问题会成为python们的常态,所以要点只有两点,

1。首先是要

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"

如果你实在不知道怎么运行这个,就在路径中直接添加下面这条,注意可能是Hostx86/x64或其他的,取决于你的操作系统,

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64

2。然后,修改你的D:\Anaconda3\envs\torch36\Lib\site-packages\torch\utils\cpp_extension.py,大概从第183行左右(取决于你的版本)开始,try-else 中那段,我加了print(".......blabla....")的那段,不会的话你copy-paste就行。gbk前面有个空格,你少打了可运行不通的。

    # First check if the compiler is one of the expected ones for the particular platform.
    if not check_compiler_ok_for_platform(compiler):
        warnings.warn(WRONG_COMPILER_WARNING.format(
            user_compiler=compiler,
            pytorch_compiler=_accepted_compilers_for_platform()[0],
            platform=sys.platform))
        return False
 
    if sys.platform.startswith('darwin'):
        # There is no particular minimum version we need for clang, so we're good here.
        return True
    try:
        if sys.platform.startswith('linux'):
            minimum_required_version = MINIMUM_GCC_VERSION
            version = subprocess.check_output([compiler, '-dumpfullversion', '-dumpversion'])
            version = version.decode().strip().split('.')
        else:
            print("________________windows operation system ______________________")
            minimum_required_version = MINIMUM_MSVC_VERSION
            compiler_info = subprocess.check_output(compiler, stderr=subprocess.STDOUT)
            print("________________compiler info:", compiler_info)
            #match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode().strip())
            match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode(' gbk').strip())
            version = (0, 0, 0) if match is None else match.groups()
    except Exception:
        _, error, _ = sys.exc_info()
        warnings.warn('Error checking compiler version for {}: {}'.format(compiler, error))
        return False
办法二
不修改cpp_extension.py的补充办法:

前面第一步不可以少!!!

因为只有 utf-8 将会被识别,那我们试试在系统中更变:设置-->控制面板 ->找到时钟和区域-> 管理->更改系统区域设置-->使用UTF-8 Unicode 来进行语言转换。如下图所示(图片中没有勾选你一定要选上,然后重启操作系统),

题外话不良后果一个:设置完了后你的CMD,powershell字体会消失。解决办法是点击窗口-->属性修改字体即可
————————————————
版权声明:本文为CSDN博主「丝贝视像-高精度计算机视觉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tanmx219/article/details/100829920

我安装的是VS2019,不知道是不是版本的原因,我按照网上的诸多教程都无法把cl环境配置好,所以在配置cl环境时最后看看自己是哪个版本的

过程
1.找到cl.exe的所在路径,一般都在:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx86\x86(我安在了C盘)

2.在环境变量PATH中添加C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx86\x86(注意,不包含cl.exe)

3.然后再添加C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx86\x86\cl.exe(此时才是cl.exe的完整路径)

4.在DOS窗口输入cl看看有没有相关信息出现,有就成功,没有就再找找其他方法尝试吧!
————————————————
版权声明:本文为CSDN博主「LEO-max」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zouchengzhi1021/article/details/106125716/

I have solved the problem. I meet the problem on Windows, and this is due to ninja fails to compile the plugin.
I set cl.exe(C:\Program Files(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30113\bin\Hostx64\x64) and ninja.exe(*\Anaconda\envs\*\Lib\site-packages\ninja\data\bin) to environment variables(I'm not sure if it make sense). Then I change verbose=False to verbose=True in the call to torch.utils.cpp_extension.load in nvdiffrast/torch/ops.py line 84, and find the plugin's resource file folderC:\Users\*\AppData\Local\torch_extensions\torch_extensions\Cache\nvdiffrast_plugin. I cd to the path and try to ninja it, but find ninja call cl.exe, and some head files miss(in my situation is cstddef). Then I search the file, and add the path to environment var INCLUDE(C:\Program Files(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30113\include), and the same as LIB(C:\Program Files(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30113\lib\x64).
Finally the plugin is successfully complied.

网上给出的路径和vs2017 的不太一样。后来在官方文档里面找到了需要的路径。注意,是vs2017。


1. 在环境变量中Path 那一项中添加两个路径:E:\VS2017\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86

E:\VS2017\Common7\IDE

2. 在环境变量中新建一个LIB 变量,并添加三个路径(记得加分号):

E:\VS2017\VC\Tools\MSVC\14.10.25017\lib\x86; C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\ucrt\x86; C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86;

3. 在环境变量中新建一个INCLUDE 变量,并添加两个路径(记得加分号):

E:\VS2017\VC\Tools\MSVC\14.10.25017\include; C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\ucrt;

4. 在E:\VS2017\VC\Auxiliary\Build 这个路径中点击vcvarall.bat 这个批处理程序。之后打开命令行,输入cl,如果出现下图,则配置成功……

 

上一篇

已是最后文章

下一篇

已是最新文章

发表回复