python 调用 C 动态库

首先是 C 的头文件和源文件,

#ifndef POINT_H
#define POINT_H                    

struct point
{
    int x;
    int y;
};                                 

void point_print(struct point * p);

#endif /* POINT_H */  
#include <stdio.h>
#include "point.h"                         

void point_print(struct point * p)
{
    printf("x = %d, y = %d\n", p->x, p->y);
}                                          

下面是编译命令,

gcc -fPIC -shared point.c -o libpoint.so

下面是 python 代码,

#! /usr/bin/python                

from ctypes import *              

class point(Structure):
    _fields_ = [
        ("x", c_int),
        ("y", c_int)
    ]                             

ptr = point(10, 20)
libpoint = CDLL("./libpoint.so")
libpoint.point_print(byref(ptr))
libpoint.point_print(pointer(ptr))

pointer 与 byref 的区别在于后者的效率高于前者,文档中提到如果只是向外部函数传递参数的引用,那么使用 byref 即可。下面运行,

$ ./point.py
x = 10, y = 20
x = 10, y = 20
$ 

另外诸如字节序、对齐、返回值处理、类型转换和回调等等,可以参考这里

时间: 2024-10-06 18:16:27

python 调用 C 动态库的相关文章

使用ctypes在Python中调用C++动态库

使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #include <iostream> using namespace std; extern "C" { void greet() { cout << "hello python" << endl; } } 将上述的C++程序编译成动态链

[Python] Python 调用 C 共享库

Linux/Unix 平台下共享库(Shared Library)文件后缀 .so:在 Windows 平台称为动态链接库(Dynamic Link Library),文件名后缀为 .dll. 利用 ctypes 模块调用 C 共享库 ctypes 是 Python 标准库提供的一个模块,Python 2.3 版本以上支持该模块.ctypes 是 Python 高级外部函数接口,Python 通过它可以调用 C 语言编译的静态链接库和动态链接库.ctypes 支持多个平台,包括 Windows,

调用 C 动态库

调用 C 动态库 由 王巍 (@ONEVCAT) 发布于 2015/11/04 C 是程序世界的宝库,在我们面向的设备系统中,也内置了大量的 C 动态库帮助我们完成各种任务.比如涉及到压缩的话我们很可能会借助于 libz.dylib,而像 xml 的解析的话一般链接 libxml.dylib 就会方便一些. 因为 Objective-C 是 C 的超集,因此在以前我们可以无缝地访问 C 的内容,只需要指定依赖并且导入头文件就可以了.但是骄傲的 Swift 的目的之一就是甩开 C 的历史包袱,所以

JNI_Android项目中调用.so动态库

JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 参考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者介绍了如何使用Java代码调用DLL动态库中的C/C++方法,似乎已经是很久以前的做法了,遇到的错误笔者还未找到解决方案,但动态库着实是找到的,只是无法调用相应的方法.本篇博客来介绍一下如何在Android项目当中使用NDK生成.so动态链接库,并在程序中使用. 1. 在Eclipse中创建项目:T

关于32位和64位部署出现C#调用delphi动态库DLL不成功的问题

由于项目中调用了动态库,这些动态库放在C:\Windows\System32下面,但是当部署到了64位的机器上可能就有问题了,最近这个问题就纠结了半天,在本机32为系统上测试动态调用ddl成功了,部署到64位Window Server2008上面也没问题,可是为什么到了64位的WIN7系统上出了问题呢?        最后才发现原来原来是DLL的位置不对,那么DLL到底该放到那呢?        如果细心的你,你会发现在C:\Windows\目录下面有两个文件夹:System目录和System3

c#调用c++动态库的一些理解

c#调用c++动态库一般我们这样写 [DllImport("UCamer.dll", CallingConvention = CallingConvention.Winapi)] public extern static void Disp_Destroy(IntPtr hShow); DllImport的第一个参数UCamer.dll是动态库dll的路径,此dll放在程序运行的根目录或者c:windows/sytem32下 CallingConvention 参数是c#调用c++的方

C#调用C++动态库

1.若C#调用VC的动态库,而dll中使用了MFC则须将MFC静态链接到dll中. 2.C#调用C++的动态库有三种方法:COM组件.托管代码.非托管代码. COM组件需客户端注册,若客户无管理员权限则无法使用: 托管代码可以将dll中的类导出,但需要写托管代码,添加工作量且代码看上去有点**: 非托管代码不能导出dll中的类,只能导出函数,但好处是dll比较正统,可以给C/C++/C#使用. 3.C#调用C++动态库时需留意参数传递问题,dll中的接口字符串类型最好用char*. 4.传入参数

C#总结(四)调用C++动态库

由于公司很多底层的SDK,都是C++开发,上层的应用软件却是C# Winform程序.在实际工作的过程中,就经常碰到了C# 程序调用C++ 动态库的问题.最近一直在和C++ 打交道,C# 怎么调用C++ 类库函数.也遇到了一些问题,所以就来总结总结C#程序调用C++动态库时的各种坑. 1. 可能遇到的问题: C#在调用动态库的过程中我也遇到了以下一些问题: 1.C++中有指针,C#中需要使用指针吗? 由于C++中的动态库中有指针参数,因此我也是用.NET的不安全代码,使用了C#的指针,但是也还是

electron调用c#动态库

electron调用c#动态库 新建C#动态库 方法要以异步任务的方式,可以直接包装,也可以写成天然异步 代码如下 public class Class1 { public async Task<Object> Invoke(object input) { return Helper.SayHi("Invoke1:" + (string)input); } public async Task<Object> Invoke2(object input) { ret