python3.6 cython编译解决无Python.h等头文件问题

跑3DDFA代码,需要cython编译一个C++的函数

(应该是由一个.cpp .pyx编译出一个.so文件)

build的过程中发现include的部分报错

mesh_core_cython.cpp:4:10: fatal error: Python.h: 没有那个文件或目录
 #include "Python.h"
          ^~~~~~~~~~
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

在文件系统用

locate Python.h

看一下程序想要的这个头文件目前的路径

发现是在 usr/include/python2.7下

通过修改setup.py里的

setup(
    name='mesh_core_cython',
    cmdclass={'build_ext': build_ext},
    ext_modules=[Extension("mesh_core_cython",
                           sources=["mesh_core_cython.pyx", "mesh_core.cpp"],
                           language='c++',
                           # include_dirs=[numpy.get_include()])],
                           include_dirs=["/usr/include/python2.7"])]
)

成功编译出了.so 文件和.cpp函数,但是后面程序调用的时候报错

undefined symbol: _Py_ZeroStruct

查了查可能是因为编译的python版本和调用的python版本不一致,我项目要用的是python3.6,但上面我是用系统自带的python2.7的头文件编译的,所以当然不行。

但为什么我没有一个python3.6的文件夹下有同样的头文件呢

原来是因为我没有装python3 dev

用下面的命令安装

sudo apt-get install python3-dev

过程中出现错误,官网资源列表里是对应ubuntu18.04.3的,而我目前的系统是18.04.01,所以用下面的命令更新下系统之后重新装

 sudo apt update
sudo apt-get install python3-dev

现在就有3.6的目录了,如下图

改路径

setup(
    name='mesh_core_cython',
    cmdclass={'build_ext': build_ext},
    ext_modules=[Extension("mesh_core_cython",
                           sources=["mesh_core_cython.pyx", "mesh_core.cpp"],
                           language='c++',
                           # include_dirs=[numpy.get_include()])],
                           include_dirs=["/usr/include/python3.6"])]
)

然后重新编译!调用成功啦!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中打开 .h 头文件并不是一个常见的操作。通常,我们使用 .h 头文件是为了在 C/C++ 程序中使用它们,而不是直接在 Python 中使用。 但如果你确实想在 Python 中使用 .h 头文件,有几种方法可以做到。一种方法是使用 Cython 来将 .h 头文件包装成 Python 可以使用的形式。这需要你先安装 Cython,然后使用 Cython 的特殊语法来将 .h 头文件包装成可以在 Python 中使用的形式。 另一种方法是使用 ctypes 库来调用 C 函数。这需要你先编写一个 C 程序,然后使用 ctypes 库来调用 C 程序中的函数。这样,你就可以在 Python 中访问 .h 头文件中的 C 函数了。 总的来说,如果你想在 Python 中使用 .h 头文件,可以使用 Cython 或 ctypes 库来实现。 ### 回答2: 在Python中,要打开.h头文件,可以使用`open()`函数来实现。具体步骤如下: 1. 首先,在Python中导入`os`模块,以便与操作系统进行交互。例如:`import os`。 2. 使用`os.path`模块的`join()`函数,将头文件的路径和文件名拼接在一起。例如:`file_path = os.path.join(header_dir, header_name)`。其中,`header_dir`是头文件所在的文件夹路径,`header_name`是头文件的文件名。 3. 使用`open()`函数打开头文件,获得一个文件对象。例如:`file = open(file_path, 'r')`。其中,`file_path`是头文件的完整路径,`'r'`表示以只读方式打开文件。 4. 可以使用`file`对象的`read()`方法,读取头文件的内容。例如:`content = file.read()`。 5. 使用`file`对象的`close()`方法,关闭文件。例如:`file.close()`。 这样,就可以通过以上步骤来打开一个.h头文件,并读取其内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值