python调用C/C++程序出现的32位和64位的问题

最近在学习使用python调用C++程序。具体步骤是先用gcc生成.so文件,然后在python中调用。
具体大家可以参考博客:https://blog.csdn/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/projects/mingw-w64/files/mingw-w64/

但建议不要下载exe,因为安装非常非常慢。建议下载压缩文件然后解压。具体可以参考博客:https://blog.csdn/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位问题。

更多推荐

python调用C/C++程序出现的32位和64位的问题