python调用c语言内核计算,在Linux上实现Python调用C语言函数

一般思路

Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用。

假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y).

将.c文件编译成 .so文件

gcc -fPIC -shared test.c -o test.so

运行后会看到有test.so文件生成。

在Python中导入C文件

在当前目录下打开Python

import os

from ctypes import *

p = os.getcwd() + '/test.so’ #表示.so文件的绝对路径,如果你没在当前路径打开python则可能需要修改

f = CDLL(p) #读取.so文件并赋给变量f

这时如果没报错,就说明导入该.so文件成功了,可以调用脚本中的函数。

调用函数

# 变量为整数

a = 3

b = 4

f.func(a, b) #该步即运行函数func(x,y)

# 变量为浮点数

c = c_float(5.5)

d = c_float(6.66)

f.func(c, d)

以上便为调用C中函数的简单形式。

复杂情况

有时,在我们需要的C脚本中,调用了其他的库,或者也同时调用了以 .h形式被调用的同级别的C脚本。这种情况需要以下步骤:

将所有.c文件编译为 .o文件

该步骤就按你的需求去编译生成,但记得加入 -fPIC, 编译后生成一个或多个.o文件。如果你的C脚本只有一个(即并未调用其他同级别C脚本),当然只有1个.o文件。几个C脚本生成几个.o文件。

将所有.o文件编译为.so文件

gcc -shared -o main.so *.o *-lfftw3 *

上述命令将所有的.o文件编译为main.so文件,最后的-lfftw3表示C脚本中调用的其他库,我的是fftw3库,你需要加你自己调用的库名字。运行后可生成main.so文件

可用 ldd -r main.so查看.so文件,如果未出现undefined symbol,则编译应该是正确的。

运行脚本

如果你需要运行脚本而不是只用某个函数,可直接运行该脚本的 main函数

import os

from ctypes import *

p = os.getcwd() + '/test.so’

f = CDLL(p)

f.main() #运行C脚本中的main函数

python 调用c语言函数

虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...

python 调用 C语言函数

python可以直接调用C语言的函数,本文记录用ctypes调用c语言的方法. test.c #include int test(char *temp) { print ...

【Python】python 调用c语言函数

虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指定调用函数.这些函数 ...

python调用C语言接口

python调用C语言接口 注:本文所有示例介绍基于linux平台 在底层开发中,一般是使用C或者C++,但是有时候为了开发效率或者在写测试脚本的时候,会经常使用到python,所以这就涉及到一个问题 ...

Matlab调用C语言函数

Matlab调用C语言函数 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y ;}现在我想要在 ...

keil or c51 汇编调用c语言函数 容易忽视的问题

最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...

【转】Python调用C语言动态链接库

转自:https://www.cnblogs.com/fariver/p/6573112.html 动态链接库在Windows中为.dll文件,在linux中为.so文件.以linux平台为例说明py ...

在linux上安装python, jupyter, 虚拟环境(virtualenv)以及 虚拟环境管理之virtualenvwraper

一, 安装python31.下载python3源码 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz2.解压缩源码包,去 ...

Python调用R语言

网络上经常看到有人问数据分析是学习Python好还是R语言好,还有一些争论Python好还是R好的文章.每次看到这样的文章我都会想到李舰和肖凯的,书中一直强调,工具不 ...

随机推荐

Oracle Blob数据保存为文件

好久不写文,最近得空写一点.Oracle数据库国内用户量主要在企业上,其中有一种byte的存储称为Blob,并不能直接看. 有时候为了调试需要,可以通过: ,)) ; 这种sql去转为字符串查看,但是 ...

使用CSS隐藏HTML元素的4种常用方法

现在的网页设计越来越动态化,我们经常需要隐藏某些元素,在特定的时候才显示它们.我们通常可以使用4种方法来隐藏和显示元素. 这4种显示和隐藏元素的技术各自有它们自己的优点的缺点,下面来举例说明. 在这篇 ...

转——Android测试之monkey

一.为什么要用Monkey 测试?   简单在说就是象猴子一样乱点,为了测试软件的稳定性,健壮性.号称最快速有效的方法.有时候运行相同系列的测试,即使是复杂的测试,但是以相同的顺序和路径,即使一遍又一 ...

【java】String类和StringBuffer类常用操作

String类是字符串常量,是不可更改的常量.而StringBuffer是字符串变量,它的对象是可以扩充和修改的.StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于Stri ...

Redis批量导入数据

首先准备数据文件 格式为 SET Key0 Value0 SET Key1 Value1 ... SET KeyN ValueN 利用shell转换数据 #!/bin/bash while read ...

【Away3D代码解读】其它一些的记录(持续更新)

查看当前正在使用的AGAL代码可以在程序开始时添加下面的代码,AGAL代码会被trace出来: Debug.active = true; 具体的输出是在MaterialPassBase类的update ...

android 75 新闻列表页面

new.xml

MFC之MessageBox用法

一    函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer; hWnd:对话框父窗口 ...

软工+C(2017第7期) 野生程序员

// 上一篇:最近发展区/脚手架 // 下一篇:提问和回复 怎样做足够好的软件?我们就差一个程序员! 没有什么软件工程的理论的时候,程序员们凭借自己对编程的热爱,凭借着:"这是一个可以自动化 ...

你可能感兴趣的:(python调用c语言内核计算)