在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函数
在Linux上实现Python调用C语言函数的更多相关文章
- python 调用c语言函数
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...
- python 调用 C语言函数
python可以直接调用C语言的函数,本文记录用ctypes调用c语言的方法. test.c #include <stdio.h> int test(char *temp) { print ...
- 【Python】python 调用c语言函数
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指定调用函数.这些函数 ...
- python调用C语言接口
python调用C语言接口 注:本文所有示例介绍基于linux平台 在底层开发中,一般是使用C或者C++,但是有时候为了开发效率或者在写测试脚本的时候,会经常使用到python,所以这就涉及到一个问题 ...
- 【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
问题描述 在上篇博文"[Azure 应用服务]App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)"中,实现了通过 HT ...
- 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.解压缩源码包,去 ...
随机推荐
- pidstat 命令详解(转载)
转自https://www.jianshu.com/p/3991c0dba094 pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu.内存.线程.设备I ...
- 有关 CMMI
CMMI的全称为Capability Maturity Model Integration,即能力成熟度模型集成.CMMI是CMM模型的最新版本.早期的CMMI(CMMI-SE/SW/IPPD),SE ...
- centos后台运行程序
putty等软件运行,python程序:python p.py 只要一关闭putty, 程序就结束.如何让退出终端或关闭终端电脑,还能让程序在服务器后台运行Python. 关键的命令:nohup ...
- C++内存泄漏的几种情况
1. 在类的构造函数和析构函数中没有匹配的调用new和delete函数 两种情况下会出现这种内存泄露:一是在堆里创建了对象占用了内存,但是没有显示地释放对象占用的内存:二是在类的构造函数中动态的分配了 ...
- 【leetcode】1267. Count Servers that Communicate
题目如下: You are given a map of a server center, represented as a m * n integer matrix grid, where 1 me ...
- DEDE怎么让栏目列表以权重拍排列
方法/步骤 进入后台到栏目里,新发布文章也行,编辑文章也行,你会看到有个权重值,不管你怎么改变保存后依然没有变化. 修改权重值,打开dede\album_edit.php文件,找到 UPD ...
- 计蒜客 2018南京网络赛 I Skr ( 回文树 )
题目链接 题意 : 给出一个由数字组成的字符串.然后要你找出其所有本质不同的回文子串.然后将这些回文子串转化为整数后相加.问你最后的结果是多少.答案模 1e9+7 分析 : 应该可以算是回文树挺裸的题 ...
- 【杂题】[AGC034F] RNG and XOR【集合幂级数】【FWT】【DP】
Description 你有一个随机数生成器,它会以一定的概率生成[0,2^N-1]中的数,每一个数的概率是由序列A给定的,Pi=Ai/sum(Ai) 现在有一个初始为0的数X,每一轮随机生成一个数v ...
- mysql bit 和 tinyint 的区别及使用场景?
bit类型语法:bit[(M)] : 位字段类型.M表示每个值的位数,范围从1到64.如果M被忽略,默认为1. tinyint是数字类型,存储小数, 一般对应编辑语言里的小字典或枚举类型. 节省空间的 ...
- latex参考文献中作者名字含有特殊字符怎么办