ctypes

ctypes类型C型Python类型
c_bool_Boolbool
c_charchar1个字符的字节对象
c_wcharwchar_t1个字符的字符串
c_bytecharint
c_ubyte无符号 charint
c_shortshortint
c_ushort无符号 短int
c_intintint
c_uint无符号 intint
c_longlongint
c_ulong无符号 长int
c_longlong__int64或长 长int
c_ulonglong无符号 __ int64或无符号 长 长 t6 >int
c_size_tsize_tint
c_ssize_tssize_t or Py_ssize_tint
c_floatfloatfloat
c_doubledoublefloat
c_longdoublelong doublefloat
c_char_pchar *(NUL terminated)字节对象或None
c_wchar_pwchar_t *(NUL terminated)字符串或None
c_void_pvoid *int或None
In[2]: from ctypes import *
In[3]: i = c_int32(1)  # c语言数字类型
In[4]: i
Out[4]: c_long(1)  # 
In[5]: i.value = 2  # 通过.value来赋值
In[6]: i
Out[6]: c_long(2)
In[7]: p = pointer(i)  # 创建指针指向i
In[8]: p
Out[8]: <ctypes.wintypes.LP_c_long at 0x5628f48>
In[9]: p.contents  # 访问指针内容
Out[9]: c_long(2)
In[10]: p.contents = c_int(1)  # 改变指针指向的内容
In[11]: p
Out[11]: <ctypes.wintypes.LP_c_long at 0x5628f48>  # 指针没有发生变化
In[12]: p.contents
Out[12]: c_long(1)  # 指针指向的内容发生了变化

测试单个c函数方法接口

windows的dll,linux下的so
1.编写single.c

#include <stdio.h>                                                                 
int add(int a){
    a = a +1;
    return a;
}

2.编译single.c

gcc single.c -shared -o single.so //shared选项是让c的方法可以被外部调用

3.测试
3.1.测试调用c函数的时间
编写single_c.py

from ctypes import cdll
c_lib=cdll.LoadLibrary('./single.so')
a=1
for i in range(1000000):
    a=c_lib.add(a)
print(a)

编写single_py.py

def add(a):
    a = a + 1
    return a

a=1
for i in range(1000000):
    a=add(a)
print(a)

使用cProfile对二者进行测试

python -m cProfile single_py.py # 测试纯python脚本的计算结果
1000003 function calls in 0.314 seconds

python -m cProfile single_c.py # 测试有c接口的python脚本计算结果
136 function calls in 0.339 seconds

结果是纯python脚本的速度要高于有c接口的

测试带有循环的c函数接口

1.编写loop.c

#include <stdio.h>
int add(int a){
    int i;
    for(i =1;i <=1000000;i++){
    a = a +1;
    }
    return a;
}

2.编译loop.c

gcc single.c -shared -o single.so //shared选项是让c的方法可以被外部调用

3.测试
3.1.测试调用c函数的时间
编写single_c.py

from ctypes import cdll                                                                                                         
c_lib=cdll.LoadLibrary('./hello_world.so')                                         
a=1                                                                                
a=c_lib.add(a)                                                                     
print(a)

使用cProfile对二者进行测试

python -m cProfile single_py.py # 测试纯python脚本的计算结果
1000003 function calls in 0.314 seconds

python -m cProfile loop_c.py # 测试有c接口的python脚本计算结果
135 function calls in 0.008 seconds

参考文献:
https://docs.python.org/2/library/ctypes.html
https://www.cnblogs.com/gaowengang/p/7919219.html
http://www.jb51.net/article/71216.htm
http://python.jobbole.com/87044/

`ctypes` 是 Python 的内置模块之一,因此无需单独下载或安装它[^1]。只要用户的 Python 环境已经正确配置完成,就可以直接通过 `import ctypes` 来使用该模块。 然而,在某些情况下,开发者可能会遇到无法导入 `ctypes` 或者误以为需要重新安装的情况。这通常是因为环境配置错误或者误解所致。以下是解决方法: ### 验证 Python 版本和支持情况 确保当前使用的 Python 版本支持 `ctypes` 模块。自 Python 2.5 起,`ctypes` 已经被纳入标准库。可以通过运行以下命令验证是否可以正常导入: ```python try: import ctypes print("Successfully imported ctypes.") except ImportError as e: print(f"Failed to import ctypes: {e}") ``` 如果上述代码能够成功执行并打印 `"Successfully imported ctypes."`,则说明 `ctypes` 可用,无需进一步操作。 --- ### 如果仍然出现问题 #### 方法一:检查 Python 安装完整性 有时由于不完整的 Python 安装可能导致部分标准库缺失。建议卸载现有 Python 并从官方源重新安装最新版本的解释器[^3]。可以从 [Python官方网站](https://www.python.org/) 下载适合的操作系统对应的安装包。 #### 方法二:确认依赖项是否存在冲突 在极少数情况下,其他第三方库可能干扰了 `ctypes` 的正常使用。尝试创建一个新的虚拟环境来隔离潜在冲突: ```bash python -m venv myenv source myenv/bin/activate # Linux/macOS myenv\Scripts\activate # Windows pip install --upgrade pip setuptools wheel ``` 激活新环境后再次测试 `ctypes` 是否可用。 #### 方法三:关于混淆名称的处理 有用户提到他们试图寻找名为 “ctypes”的独立项目却未果。实际上,“ctypes”本身作为标准库的一部分存在;而类似于“ctypeslib”这样的工具则是用于辅助生成 `ctypes` 类型定义的一个外部扩展[^2]。如果确实需要用到此类功能,则需手动安装对应软件包: ```bash pip install git+https://gitcode.com/gh_mirrors/ct/ctypeslib.git@master ``` 注意此命令会克隆指定仓库中的内容并编译安装至本地环境中。 --- ### 使用实例展示 下面给出一段简单的例子演示如何利用 `ctypes` 加载共享对象文件(.so/.dll),以及设置参数类型与返回值类型的完整流程][^[^45]: ```python from ctypes import * # 假设有一个C++实现的功能存储于 test.so 中 lib = CDLL("./test.so") # 设定输入输出的数据形式 lib.add.argtypes = (c_int, c_int) lib.add.restype = c_int result = lib.add(c_int(7), c_int(8)) print(f"The result of adding is {result}.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值