python调用c文件

很多python的库文件都是由c转换而来(有可能是用c更高效,也有可能是c上实现了懒的再写一遍),今天想了解一下转换过程,就去搜了一下

查阅后发现主要有两种方式:

  • 将.c编译为.so(linux下)或.dll(windows下)的文件,在python中使用ctypes库去调用编译后文件
  • 在c中调用Python.h,编写一些接口函数与定义函数,执行指向此c文件的setup.py,生成.pyd文件,由python直接调用

本着在最终的python文件中代码越简单越好的原则,我选择方法二

一开始,我参照了一篇简书中的文章:Python调用C函数的方法以及如何编写Python的C扩展, 但出现了一些报错


mymath.c(1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
mymath.c(40): warning C4013: “Py_InitModule”未定义;假设外部返回 int
mymath.c(40): warning C4047: “=”:“PyObject *”与“int”的间接级别不同
LINK : error LNK2001: 无法解析的外部符号 PyInit_mymath
build\temp.win32-3.8\Release\mymath.cp38-win32.lib : fatal error LNK1120: 1 个无法解析的外部命令
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.25.28610\\bin\\HostX86\\x86\\link.exe' failed with exit status 1120

vscode窗口大小有限,先看到了后面的错误,搜索一番并确定我的机器没有32位与64位的问题后,往前翻翻看到了前三个warning,这看起来像是在最后几行中的那个函数有误

又查了查,发现这个函数在python3中已经被弃用,python3中可用的代码是这样的:Python3.X使用C Extensions调用C/C++,具体内容这篇csdn的文章写得很清楚

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注