c/c++和python混合编程试验の二

python调用c/c++

以下只是个人记录,查看资料的同学可以却步了。
虽然c/c++中可以调用python所写的脚本,但我好像没怎么见过这个的使用,更多的还是调用lua脚本或者js脚本,而python调用c/c++的情况应该更多,主要是把python程序中的涉及高性能需求的部分,用c/c++封装,然后由python程序调用。

上一节

一、python调用c函数

如下是一个c库函数文件

#include <stdio.h>

int f(int a, int b) {
    
    
	printf("%d + %d :\n", a, b);
	return a+ b;
}

void sayhi(){
    
    
	printf("Hello, world.\n");
}

然后把该文件用gcc编译生成python可调用的动态库

gcc -fPIC -shared -o libcfun.so cfun.c

然后得到的是32位.so文件,但我们的python是64位,两个不一致,就会导致出错。

>>> from ctypes import *
>>> lib = cdll.LoadLibrary("./libcfun.so")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Python39\lib\ctypes\__init__.py", line 452, in LoadLibrary
    return self._dlltype(name)
  File "D:\Python39\lib\ctypes\__init__.py", line 374, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。

网上有办法是使用anaconda来管理当下python,让32位和64位并存,在需要调用32位.so时切换到32位python下进行。
anaconda管理python切换来解决上述错误
具体如何,我不清楚,我是想使用gcc来生成64位.so文件不也能解决问题吗?所以我搜索到一个命令

 gcc -fPIC -shared -o libcfun.so cfun.c -m64

结果显示没有64位代码链接

PS C:\Users\samu\Desktop> gcc -fPIC -shared -o libcfun.so cfun.c -m64
cfun.c:1:0: warning: -fPIC ignored for target (all code is position independent)
 #include <stdio.h>
 ^
cfun.c:1:0: sorry, unimplemented: 64-bit mode not compiled in

哇,难受啊。不过我查看了我的gcc版本,又好像是对应64位的,让我一阵懵逼。

PS C:\Users\samu\Desktop> gcc -v
Using built-in specs.
COLLECT_GCC=D:\Qt5.6.1\mingw\Tools\mingw492_32\bin\gcc.exe
COLLECT_LTO_WRAPPER=D:/Qt5.6.1/mingw/Tools/mingw492_32/bin/../libexec/gcc/i686-w64-mingw32/4.9.2/lto-wrapper.exe
Target: i686-w64-mingw32

这个方法进行下去就是我薄弱的gcc编译部分了,干脆使用上一个办法看看。不过这里就要先学习学习anaconda的使用和对python的管理,就先到此为止。

总结一下,python调用c/c++函数,就是:
1、编写好你的c/c++函数;
2、把该函数文件编译成库,windows下.dll库,linux下.so库;
3、python程序中加载库并调用
这里做个更改, 上面的操作都是基于windows环境下的cmd操作,现在才发现我找到的资料都是基于linux环境下的操作,所以前面的出错都是“不审题”的结果。
再来!

#include <stdio.h>

void sayhi()
{
    
    
        printf("Hello, world.\n");
}

然后我们生成该动态库

gcc test.c -fPIC -shared -o libcfun.so

生成后就是python代码中加载并调用

jack@DESKTOP-SJO8SMG:/mnt/c/Users/samu$ python3
Python 3.8.10 (default, Jun  2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> lib = cdll.LoadLibrary("./libcfun.so")
>>> lib.sayhi()
Hello, world.
14
>>>

让我不知为何的是,它最后输出个字符统计数是怎么回事。不过还是继续吧。

最后一节

猜你喜欢

转载自blog.csdn.net/weixin_44948269/article/details/121651769