在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.解压缩源码包,去 ...
随机推荐
- 并发编程的锁机制:synchronized和lock
1. 锁的种类 锁的种类有很多,包括:自旋锁.自旋锁的其他种类.阻塞锁.可重入锁.读写锁.互斥锁.悲观锁.乐观锁.公平锁.可重入锁等等,其余就不列出了.我们重点看如下几种:可重入锁.读写锁.可中断锁. ...
- IT项目开发流程
项目开发流程: 一.需求分析:相关系统分析员向用户初步了解需求,然后用相关的工具软件列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面时,在这一步里面可以初步 ...
- Java技术综述
自己打算好好学习下Java,所以想先明晰Java开发中到底有哪些技术,以便以后学习的过程中,可以循序渐进,随着学习的深入,本文将不断更新. Java基础教程将Java的入门基础知识贯穿在一个实例中,逐 ...
- 将Excel数据读入DataGridView
OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Microsoft Excel ...
- oracle 循环的一种写法
for v_n in( select bb.temNum, bb.LOANTYPE from (select decode(bns.assignstate, '{016D68F9-719B-4EFC- ...
- 悲观锁,乐观锁以及MVCC
在上文中,我们探讨了MySQL不同存储引擎中的各类锁,在这篇文章中我们将要讨论的是MySQL是如何实现并发控制的.并发问题有三种,分别为: 读-读,不存在任何问题 读-写,有隔离性问题,可能遇到脏读( ...
- 51 Nod 1242 矩阵快速幂求斐波那契数列
#include<bits/stdc++.h> #define mod 1000000009 using namespace std; typedef long long ll; type ...
- H5自定义video功能与样式处理
H5的video非常简单,方便,有时我们可能需要自己来设置样式来自定义的video,自定义的话我们需要对功能进行一些处理,这里常用的功能几乎是都用到了,第一次练习代码很累赘,之后会慢慢改进. 常用的一 ...
- Java常考面试题整理(三)
明天又要去面试,Good luck to me.,让我在这段时间换个新的工作吧. 41.在Java中,对象什么时候可以被垃圾回收? 参考答案: 当对象对当前使用这个对象的应用程序变得不可触及的时候,这 ...
- C++入门经典-例6.8-gets_s与puts的应用
1:使用标准输入函数cin和格式化输入函数scanf时都存在这样一个问题:当输入空格时,程序不会接受空格符之后的内容内容. 输入函数gets_s与输出函数puts都只以结束符'\0'作为输入\输出结束 ...