问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python调用c函数

发布网友 发布时间:2022-04-21 19:27

我来回答

3个回答

热心网友 时间:2022-04-07 13:39

Python是解释性语言, 底层就是用c实现的, 所以用python调用C是很容易的, 下面就总结一下各种调用的方法, 给出例子, 所有例子都在ubuntu9.10, python2.6下试过
1. Python 调用 C (base)
想在python中调用c函数, 如这儿的fact
#include <Python.h>

int fact(int n)
{
if (n <= 1)
return 1;
else
return n * fact(n - 1);
}

PyObject* wrap_fact(PyObject* self, PyObject* args)
{
int n, result;

if (! PyArg_ParseTuple(args, "i:fact", &n))
return NULL;
result = fact(n);
return Py_BuildValue("i", result);
}

static PyMethodDef exampleMethods[] =
{
{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
{NULL, NULL}
};

void initexample()
{
PyObject* m;
m = Py_InitMole("example", exampleMethods);
}

把这段代码存为wrapper.c, 编成so库,
gcc -fPIC wrapper.c -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

然后在有此so库的目录, 进入python, 可以如下使用
import example
example.fact(4)

2. Python 调用 C++ (base)
在python中调用C++类成员函数, 如下调用TestFact类中的fact函数,
#include <Python.h>

class TestFact{
public:
TestFact(){};
~TestFact(){};
int fact(int n);
};

int TestFact::fact(int n)
{
if (n <= 1)
return 1;
else
return n * (n - 1);
}

int fact(int n)
{
TestFact t;
return t.fact(n);
}
PyObject* wrap_fact(PyObject* self, PyObject* args)
{
int n, result;

if (! PyArg_ParseTuple(args, "i:fact", &n))
return NULL;
result = fact(n);
return Py_BuildValue("i", result);
}

static PyMethodDef exampleMethods[] =
{
{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
{NULL, NULL}
};

extern "C" //不加会导致找不到initexample
void initexample()
{
PyObject* m;
m = Py_InitMole("example", exampleMethods);
}

把这段代码存为wrapper.cpp, 编成so库,
g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

然后在有此so库的目录, 进入python, 可以如下使用
import example
example.fact(4)

3. Python 调用 C++ (Boost.Python)
Boost库是非常强大的库, 其中的python库可以用来封装c++被python调用, 功能比较强大, 不但可以封装函数还能封装类, 类成员.
http://dev.gameres.com/Program/Abstract/Building%20Hybrid%20Systems%20with%20Boost_Python.CHN.by.JERRY.htm
首先在ubuntu下安装boost.python, apt-get install libboost-python-dev
#include <boost/python.hpp>
char const* greet()
{
return "hello, world";
}

BOOST_PYTHON_MODULE(hello)
{
using namespace boost::python;
def("greet", greet);
}

把代码存为hello.cpp, 编译成so库
g++ hello.cpp -o hello.so -shared -I/usr/include/python2.5 -I/usr/lib/python2.5/config -lboost_python-gcc42-mt-1_34_1

此处python路径设为你的python路径, 并且必须加-lboost_python-gcc42-mt-1_34_1, 这个库名不一定是这个, 去/user/lib查

然后在有此so库的目录, 进入python, 可以如下使用
>>> import hello
>>> hello.greet()
'hello, world'

4. python 调用 c++ (ctypes)
ctypes is an advanced ffi (Foreign Function Interface) package for Python 2.3 and higher. In Python 2.5 it is already included.
ctypes allows to call functions in dlls/shared libraries and has extensive facilities to create, access and manipulate simple and complicated C data types in Python - in other words: wrap libraries in pure Python. It is even possible to implement C callback functions in pure Python.
http://python.net/crew/theller/ctypes/

#include <Python.h>

class TestFact{
public:
TestFact(){};
~TestFact(){};
int fact(int n);
};

int TestFact::fact(int n)
{
if (n <= 1)
return 1;
else
return n * (n - 1);
}

extern "C"
int fact(int n)
{
TestFact t;
return t.fact(n);
}
将代码存为wrapper.cpp不用写python接口封装, 直接编译成so库,
g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

进入python, 可以如下使用
>>> import ctypes
>>> pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')
>>> pdll.fact(4)
12

热心网友 时间:2022-04-07 14:57

我觉得会受到*的,因为c_char_p是遵循c字符串标准的,会以NULL为结束。下面的代码只输出hello,也许真要传递内嵌NULL的,只能靠编写python扩展了,也很简单的,用swig。

from ctypes import *
import struct

example=cdll.LoadLibrary("example.dll")
s=create_string_buffer('hello\x00world')
example.test.restype=c_char_p
example.test.argtypes = [c_char_p]
r=example.test(s) #("hello\x00world")
print r追问给个例子吧
怎么把带‘\x00’的字符串传回python?

追答可以参考python附带的ctypes的说明文档。比如把返回类型声明为c_char*20,就会返回20个字符的数组,不过由于你不知道原来多长,所以这个20还是有问题的。估计彻底的方法只能使用Python的c API写扩展了。那样灵活度更高

热心网友 时间:2022-04-07 16:31

如果有一堆\0,你怎么知道这个指针指向的内容什么时候结束?比如应该读取10个字节,还是100个字节。
最起码要加一个标示指针所指内容长度的参数。
python中如何调用c语言函数?

1. 定义 C 函数原型:python from ctypes import CDLL, c_int 加载动态链接库 c_lib = CDLL('./libexample.so')定义 C 函数原型 c_func = c_lib.example_func c_func.argtypes = [c_int]c_func.restype = c_int 2. 调用 C 函数:python 调用 C 函数 result = c_func(10)print...

python调用c程序

编写一个 C 语言 wrapper 文件(py_testwrapper.c),用于适配 Python 与 C 之间的数据类型。确保包含 Python.h 和 py_test.h,定义 Python 方法以调用 C 函数。3. **编译与安装 使用 setup.py 文件来编译生成的 C 代码。通过终端命令“python3 setup.py build”编译代码,然后运行“sudo pytho...

如何在Python中调用C/C++函数

使用ctypes调用C/C++函数时,需要注意基础数据类型的转换、字符串的传递、函数返回值的获取、指针的使用、数组的传递、结构体的传递,以及回调函数的表示。ctypes内部函数的使用方法对从Python中正确调用C/C++函数至关重要。为了在Python中使用C/C++函数,需要将C/C++代码编译成动态链接库或可执行文件。在Li...

将C函数编译成库,然后用python调用

步骤如下:编写C源文件(如hello.c)包含"Hello World"函数。使用C编译器将源文件编译成共享库(通常在Unix/Linux为.so文件,在Windows为.dll文件)。在Python中使用ctypes模块加载共享库并调用C函数。Python脚本运行时,打印"Hello, World!"。编写C程序以翻转树莓派GPIO引脚状态:创建C源文件(如gpio_...

Python中怎么调用C代码?Python中调用C代码方法

用C语言去实现,这样就会提高效率,然后在Python里面去调用这段代码。2.调用C的程序的方法有几种,今天要给大家去讲的是其中一种比较简单的方法,假如有一个C的程序叫做add.c,这是一个C的代码,写【add函数】,这个函数它接受两个int的参数,然后它会有return返回x+y的值,3.如果要去在Python...

为什么python调用的c文件中printf导致报错?

在测试.py文件中,确保正确导入或调用C函数,遵循Python的类型和指针管理规则,避免直接使用C指针而未正确处理Python对象。通过上述步骤,可以更深入地定位和解决在Python调用C文件中遇到的printf错误。如果问题依旧存在,建议进一步检查代码中的内存分配和使用情况,以及Python和C环境的兼容性。

python怎么实现调用c/cpp的库?

在尝试调用ncclCommInitRank和ncclAllReduce函数时,关注点在于打通PyTorch数据类型与nccl数据类型之间的关系。通过研究发现,将复杂类型直接定义为ctypes.c_void_p类型,并使用buffer_type(tensor.data_ptr())即可将PyTorch的tensor对象传递到动态链接库中。总结而言,本文提供了一种在特定情况下使用纯Python...

python调用c函数

1. Python 调用 C (base)想在python中调用c函数, 如这儿的fact include &lt;Python.h&gt; int fact(int n){ if (n &lt;= 1)return 1;else return n * fact(n - 1);} PyObject* wrap_fact(PyObject* self, PyObject* args){ int n, result;if (! PyArg_ParseTuple(args, "i:fact", &amp;...

如何让python调用C和C++代码

extern "C" __declspec(dllexport) void initmb() { / 当调用mb.showMsg("Python's really amazing, I kindda love it!")时, 相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式, 定义一个字典数据结构,key =&gt; showMsg, ...

【python-C相互调用】python里的dict如何作为参数传入.so中的c语言...

format应该是"s" // &gt;&gt;&gt; if(PyArg_ParseTupleAndKeywords(args,keyds,"isi",kwlist,&amp;name)) if (PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &amp;name)) { retval = (PyObject *)Py_BuildValue("i",1); printf("%s\n", name); // 问题2:不要释放 /...

micropython调用c函数 python运行c语言 python和c相互调用 python怎么运行c语言程序 python调用c语言程序 python怎么调用c语言 c语言可以用python micropython添加c模块 plecs调用C文件
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我更新了win7QQ拼音在游戏上(剑侠情缘2)不能打字?打出来的都是... 游漓江的船票在哪里买最方便?如何去 因为我想看剑侠情缘,又不想下载什么PPS啊,QQ直播之类软件, 最好是类似... ...两部手机下载相同的手游剑侠情缘却是不一样的都是在QQ上下载的 教子小书坊:一位外交官父亲给孩子的家书图书信息 教子小书坊:一位外交官父亲给孩子的家书内容简介 高二孩子和家长逆反如何教育 高二孩子和家长逆反怎么办 叛逆期孩子怎么教育沟通叛逆期孩子如何教育沟通 请问用otg连接鼠标和键盘后怎么玩手机上的全民枪战,求教程。带图的给... 去邮局寄包裹的步骤是怎么样?我没去做.不好意思问下大家 小馒头要蒸多少分钟才熟 社保证明电子版怎么弄 蒸小馒头要多长时间才熟 教师资格如何打印合格证明? 2021会计电子证书怎么打印 手机缴纳完税完成后,怎么打印电子证明? 小馒头一般蒸多少分钟 银行从业资格证电子证书打印流程是怎样的? 社保证明如何网上打印 花呗结清怎么打印电子证明? 电子税务局完税证明在哪里打印 怎么打印电子证书? 电子税务局完税证明怎么打印 浙里办无犯罪记录证明电子证明怎么打印出来 牛排几分熟才是最好吃的呢? 吃口最嫩的牛排是几分熟啊? 几分熟煎牛排吃口最嫩? 牛排几分熟好吃 牛排几分熟的样子 牛排一般吃几分熟的比较好? 木瓜是茄科类吗? 日常食用的瓜类蔬菜的胎座类型是 关于木瓜的问题,求专业人士解答 木瓜的种类有很多,你知道哪几种? 各种水果,我们分别吃的是它们的部分? 木瓜是否有不同种类 野木瓜属的形态特征 木瓜有那些特点 木瓜的种类及作用 木瓜分哪几些品种 木瓜有哪些种类,都有哪些区别? 木瓜是什么 木瓜是属于哪一类 木瓜的种类 番木瓜属的本属简介 水果果实构造分类的含义 木瓜都有什么品种? 笔记本鼠标驱动显示ps2兼容鼠标是什么意思? 海尔笔记本电脑ps/2兼容鼠标是什么意思 ps2兼容鼠标是什么意思