Python使用ctypes导入C编译dll提示WinError 193错误如何解决?
问题解决方案:ctypes调用DLL报WinError 193错误
报错核心原因
你遇到的OSError: [WinError 193] %1 is not a valid Win32 application错误,本质是编译得到的DLL文件架构,和当前运行的Python解释器架构不匹配,64位Python无法加载32位DLL,32位Python也无法加载64位DLL。
解决步骤
- 先确认当前Python的架构
打开终端执行命令:
输出为python -c "import platform;print(platform.architecture())"('64bit', 'WindowsPE')则是64位Python,输出('32bit', 'WindowsPE')则是32位Python。 - 调整gcc编译参数匹配架构
- 若使用64位Python:需安装64位版本的MinGW-w64 gcc工具链,编译时添加
-m64参数强制生成64位DLL,编译命令修改为:gcc main.c --shared -m64 -o main.dll - 若使用32位Python:需安装32位版本的gcc工具链,编译时添加
-m32参数强制生成32位DLL,编译命令修改为:gcc main.c --shared -m32 -o main.dll
- 若使用64位Python:需安装64位版本的MinGW-w64 gcc工具链,编译时添加
额外避坑提示
- C语言代码建议添加导出函数声明,避免gcc编译时自动篡改函数名,修改后的C代码如下:
__declspec(dllexport) int mul(int a, int b) {return a*b;} - Python调用DLL函数前,建议提前指定函数的参数类型和返回值类型,避免ctypes默认类型转换出错,完整调用代码如下:
若输出结果为6则代表DLL调用正常。import ctypes myDLL = ctypes.CDLL('C:\\Users\\Username\\Desktop\\main.dll') # 声明mul函数的两个入参都是int类型 myDLL.mul.argtypes = [ctypes.c_int, ctypes.c_int] # 声明mul函数的返回值是int类型 myDLL.mul.restype = ctypes.c_int # 测试调用 print(myDLL.mul(2, 3))
内容的提问来源于stack exchange,提问作者Parsa Saberi
相关产品推荐
相关产品推荐

