python调用C/C++程序出现的32位和64位的问题
python调用C/C++程序出现的32位和64位的问题
最近在学习使用python调用C++程序。具体步骤是先用gcc生成.so文件,然后在python中调用。
具体大家可以参考博客:https://blog.****.net/taiyang1987912/article/details/44779719
看起来是比较方便的,但是却遇上了32位和64位问题的坑。所以记录下来,方便大家解决问题。
先给出C/C++代码和python代码:
#include <stdio.h>
#include <stdlib.h>
int func(int a, int b)
{
int ans = a + b;
printf("You input %d and %d\n", a, b);
printf("The result is %d\n", ans);
return ans;
}
python代码:
import ctypes
import platform
ll = ctypes.cdll.LoadLibrary
lib = ll("./testpycll_32.so")
lib.func(1,3)
# platform.architecture()
理论上这样子就可以调用了,但是出现以下问题:
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
这其实因为python位数和dll位数不一样导致的,dll是64位的,而python是32位的,所以不行。必须统一。
查看python的位数
查看python支持的位数
import platform
platform.architecture()
或者直接cmd python
查看gcc的位数
判断gcc编译出来的so是多少位
gcc -v
或者
gcc --version
但是通常看你安装的MinGW的安装目录里看啊
program files就是64
program files(x86)就是32
解决方法一:将gcc变成64位
我的python版本原先是64,所以尝试了两种方案。如果你不想重新下载32位的python,可以下载一个新的gcc。网址如下:
https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
但建议不要下载exe,因为安装非常非常慢。建议下载压缩文件然后解压。具体可以参考博客:https://blog.****.net/ZHAOJUNWEI08/article/details/86602120
需要先解压,配置环境
解压完配置完环境之后,可以cmd看看版本
这便是安装成功之后的结果
然后转到C/C++文件所在目录,执行
gcc -o testpycll_64.so -shared -fPIC test.c -m64
其实就是:gcc -o 输出文件名.so -shared -fPIC 输入文件名.c -m64
当然,一些具体的文件名你们自己修改啦。
接着便是可以调用成功啦
解决方法二:将python变成32位
这个就大家自己去下载啦。我是在anaconda环境下的。默认安装是64位的。想要安装成32位的可以这样子设置,在prompt下执行以下命令
set CONDA_FORCE_32BIT=1
conda create -n py37_32 python=3.7
必须新建环境,即使你修改默认是32位,但是之前已经创建的环境是不会变化的
这样子,你就可以不用修改gcc版本啦。结果也是可以的
以上就是我在使用python调用C++程序的时候遇到的32位64位问题。