将pyx文件编译成pyd文件(很多坑,已解决)

项目场景:

Faster R-CNN项目,将pyx文件编译成pyd文件(很多坑,请注意)

项目环境

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++已经装了

然后这个倒腾了我一早上,要是能帮到你,点赞支持一下吧

### 如何在 Ubuntu 上编译 `.pyx` 文件 要在 Ubuntu 系统上使用 Cython 编译 `.pyx` 文件,可以按照以下方法操作: #### 安装必要的依赖项 首先需要确保系统已经安装了 Python 开发包以及 Cython 工具。可以通过运行以下命令来完成这些工具的安装: ```bash sudo apt update sudo apt install python3-dev python3-pip build-essential cython ``` 上述命令会安装 `python3-dev` 和其他构建所需的开发工具[^2]。 #### 创建并配置 `setup.py` 文件 为了编译 `.pyx` 文件,必须创建一个名为 `setup.py` 的脚本文件。此脚本用于定义如何通过 Cython 将 `.pyx` 转换为 C 或 C++ 并进一步编译为目标二进制文件。下面是一个典型的 `setup.py` 示例: ```python from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize("example.pyx"), # 替换为实际的 .pyx 文件路径 zip_safe=False, ) ``` 在此示例中,`ext_modules` 参数指定了要被 Cython 处理的目标 `.pyx` 文件名称。如果存在多个 `.pyx` 文件,则可以用列表形式传递给 `cythonize()` 函数[^1]。 #### 执行编译过程 保存好 `setup.py` 后,在终端进入包含该文件及其关联 `.pyx` 文件所在的目录,并执行如下命令启动编译流程: ```bash python3 setup.py build_ext --inplace ``` 这条指令会让 Cython 把指定的 `.pyx` 文件转换成对应的扩展模块(通常是共享对象文件),并且将其放置在同一位置以便后续导入和调用[^4]。 经过以上步骤之后,应该能够在当前工作目录下看到新生成的一个或者几个带有 `.so` 后缀的文件——这就是由原始 `.pyx` 源码转化而来的可加载 Python 扩展模块。 --- ### 注意事项 当尝试跨平台交叉编译时,比如从 Intel 架构下的 Ubuntu 到 ARM 设备上的应用部署,可能还需要额外考虑目标硬件环境的具体需求,包括但不限于调整 GCC 配置选项或引入特定于目标体系结构的支持库等细节问题。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PD我是你的真爱粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值