项目场景: Faster R-CNN项目,将pyx文件编译成pyd文件(很多坑,请注意)
- 问题描述
- 报错及解决
- “Unable to find vcvarsall.bat”
- 另一个错: error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools”: https://visualstudio.microsoft.com/visual-cpp-build-tools/
- TypeError: '>=' not supported between instances of 'NoneType' and 'str'
- error: command 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\bin\HostX86\x64\cl.exe' failed with exit status 2
- 报错及解决
- 其他注意事项:
项目环境
python 3.6 -- conda的虚拟环境 TensorFlow 1.15.0 win 10
问题描述
使用网上的教程进行编译
有一个需要被编译的bbox.pyx
文件,创建setup.py
文件
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("bbox.pyx"))
在命令行
python setup.py build_ext --inplace
报错及解决
运行上面的命令,可能会有这两个错误
“Unable to find vcvarsall.bat”
网上有说安装Visual Studio然后装Python的,也有说装C++的,总说纷纭。 我都试了,装Python的话基本不行,装C++后又会出现新坑,但这个新坑能被解决....
另一个错: error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools”: https://visualstudio.microsoft.com/visual-cpp-build-tools/
按照我的方式来的话,先下载C++ 下载完后,再运行,又会报以下错误
python setup.py build_ext --inplace
TypeError: '>=' not supported between instances of 'NoneType' and 'str'
在命令后面加上一个参数,因为刚刚装了C++,调他的解释器(我猜是这个原理)
python setup.py build_ext --inplace --compiler=msvc
可是运行完上面一行又会出现一下错误
error: command 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\bin\HostX86\x64\cl.exe' failed with exit status 2
解决方案是改setup.py
文件
import sys
import numpy as np
A=sys.path.insert(0, "..")
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
# ext_module = cythonize("TestOMP.pyx")
ext_module = Extension(
"cython_bbox",
["bbox.pyx"], #更改为自己想要转换的.pyx文件
extra_compile_args=["/openmp"],
extra_link_args=["/openmp"],
)
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = [ext_module],
#注意这一句一定要有,不然只编译成C代码,无法编译成pyd文件
include_dirs=[np.get_include()]
)
# python setup.py build_ext --inplace --compiler=msvc
然后再在命令行执行(为了证明这个不是巧合,我特地将生成的pyd删了,又执行了一次,发现是可行的)
python setup.py build_ext --inplace --compiler=msvc
其他注意事项:
一定要进到那个项目的虚拟环境中执行,不然生成的pyd文件就是base环境下的python版本(不要在vscode终端中执行)
一定要进到项目setup.py文件目录下执行,不然不行
要是下载了文档中的C++还是不行,看一下微软官方的说明,下载一个专门用于python的C++工具
我尝试过,好像下载失败,说是找不到下载文件(可能原文件被删了,I don't know)
pyd的调用
pyd文件的调用与py文件一样,也是import导入即可,只不过看不到里面写的到底是啥...
猜测
有没有一种可能就是,根本就是setup.py
文件写错了,导致不能编译成pyd文件,我认为可能性比较小,B站有个教pyd编译的,也是类似于开头setup.py
的写法,编译成功; 但我不敢尝试,因为C++已经装了
然后这个倒腾了我一早上,要是能帮到你,点赞支持一下吧