Python在Windows和在Linux下调用动态链接库的教程
作者:lrfgjj2 时间:2022-01-10 04:55:51
Linux系统下调用动态库(.so)
1、linuxany.c代码如下:
#include "stdio.h"
void display(char* msg){
printf("%s\n",msg);
}
int add(int a,int b){
return a+b;
}
2、编译c代码,最后生成Python可执行的.so文件
(1)gcc -c linuxany.c,将生成一个linuxany.o文件
(2)gcc -shared linuxany.c -o linuxany.so,将生成一个linuxany.so文件
3、在Python中调用
#!/usr/bin/python
from ctypes import *
import os
//参数为生成的.so文件所在的绝对路径
libtest = cdll.LoadLibrary(os.getcwd() + '/linuxany.so')
//直接用方法名进行调用
libtest.display('Hello,I am linuxany.com')
print libtest.add(2,2010)
4、运行结果
Hello,I am linuxany.com
2012
Windows下Python调用dll
python中如果要调用dll,需要用到ctypes模块,在程序开头导入模块 import ctypes
由于调用约定的不同,python调用dll的方法也不同,主要有两种调用规则,即 cdecl和stdcal,还有其他的一些调用约定,关于他们的不同,可以查阅其他资料
先说 stdcal的调用方法:
方法一:
import ctypes
dll = ctypes.windll.LoadLibrary( 'test.dll' )
方法二:
import ctypes
dll = ctypes.WinDll( 'test.dll' )
cdecl的调用方法:
1.
import ctypes
dll = ctypes.cdll.LoadLibrary( 'test.dll' )
##注:一般在linux下为test.o文件,同样可以使用如下的方法:
## dll = ctypes.cdll.LoadLibrary('test.o')
2.
import ctypes
dll = ctypes.CDll( 'test.dll' )
看一个例子,首先编译一个dll
导出函数如下:
# define ADD_EXPORT Q_DECL_EXPORT
extern "C" ADD_EXPORT int addnum(int num1,int num2)
{
return num1+num2;
}
extern "C" ADD_EXPORT void get_path(char *path){
memcpy(path,"hello",sizeof("hello"));
}
这里使用的是cdecl
脚本如下:
dll=ctypes.CDLL("add.dll")
add=dll.addnum
add.argtypes=[ctypes.c_int,ctypes.c_int] #参数类型
add.restypes=ctypes.c_int #返回值类型
print add(1,2)
get_path=dll.get_path
get_path.argtypes=[ctypes.c_char_p]
path=create_string_buffer(100)
get_path(path)
print path.value
结果如下:
我们看到两个结果,第一个是进行计算,第二个是带回一个参数。
当然我们还可以很方便的使用windows的dll,提供了很多接口
GetSystemDirectory = windll.kernel32.GetSystemDirectoryA
buf = create_string_buffer(100)
GetSystemDirectory(buf,100)
print buf.value
MessageBox = windll.user32.MessageBoxW
MessageBox(None, u"Hello World", u"Hi", 0)
运行结果如下:
标签:Python,动态链接
0
投稿
猜你喜欢
Python-OpenCV深度学习入门示例详解
2022-07-24 02:44:24
python中plt.imshow与cv2.imshow显示颜色问题
2023-12-13 10:47:54
Python实现partial改变方法默认参数
2022-10-30 20:23:33
Python机器学习入门(五)之Python算法审查
2021-10-15 09:27:48
python基于Node2Vec实现节点分类及其可视化示例详解
2022-04-16 06:49:33
Python RabbitMQ消息队列实现rpc
2023-01-30 15:16:00
Python 爬虫爬取指定博客的所有文章
2021-09-10 04:44:51
go语言net包rpc远程调用的使用示例
2024-05-29 22:06:05
手残删除python之后的补救方法
2021-04-13 12:50:04
python中二维阵列的变换实例
2021-06-28 07:54:06
Python2.7简单连接与操作MySQL的方法
2024-01-25 18:38:56
Python多进程共享numpy 数组的方法
2023-12-02 07:47:17
详解python的变量缓存机制
2023-05-11 07:47:45
Python正则表达式匹配和提取IP地址
2023-04-01 07:25:21
pycharm2022没有manage repositories配置镜像源的解决方法
2022-06-27 05:30:24
Python内建函数之raw_input()与input()代码解析
2021-01-12 01:37:36
python3中eval函数用法使用简介
2023-08-12 02:28:48
python实现清屏的方法
2021-11-02 04:10:32
opencv模板匹配相同位置去除重复的框
2022-03-09 04:06:14
用python实现将数组元素按从小到大的顺序排列方法
2022-01-07 22:03:25