在各个平台上用python来调用C语言库(C语言内置的一些函数)的方式不一样。
- Windows调用:
libc = cdll.msvcrt
- Linux调用:
libc = CDLL("libc.so.6")
- Mac调用:
libc = CDLL("libc.dylib")
- 使用C的
printf
函数:libc.printf(b "hello world")
Python判断操作系统
不需要为每个系统写一套代码,可以通过python来直接判断平台。
先用import platform
导入模块,然后调用platform.system()
可以返回系统的名称
(分别是Darwin Linux Windows )。
python跨平台调用C语言库
testclib.py
print("Test C Lib")
from ctypes import *
from platform import system
sys = system()
if sys == "Windows":
libc = cdll.msvcrt
elif sys == "Linux":
libc = CDLL("libc.so.6")
elif sys == "Darwin":
libc = CDLL("libc.dylib")
else:
printf("unknow system")
libc.printf(b"Python string %s %d", b"str001", 1001)
调用windows系统函数
我们来使用ctypes
调用win32的MessageBox
testwinapi.py
print("Test Win API")
from ctypes import *
re = windll.user32.MessageBoxA(0, "窗口内容".encode("gbk"),"请选择".encode("gbk"), 1)
if re == 1:
windll.user32.MessageBoxW(0, "点击了确认按钮","已选择", 0)
else:
windll.user32.MessageBoxW(0, "点击了取消按钮","已选择", 0)
运行程序可正常弹出对话框
注意:在win32当中调函数可以直接调用`MessageBox`,不用区分`MessageBoxA`和`MessageBoxW`,因为`MessageBox`其实是一个宏,它根据当前编码的字符集来决定调用`MessageBoxA`还是`MessageBoxW`,而这个宏在python中肯定是访问,所以需要明确指明调用`MessageBoxA`还是`MessageBoxW`