文档章节

python 调用 so 库 需要注意的地方

木兰宿莽
 木兰宿莽
发布于 2017/01/04 20:40
字数 362
阅读 877
收藏 1

     使用C++而不是C来编写so库时往往会遇到一些问题,这里着重探讨一下linux环境下C++编写so库

及python调用so库需要注意的地方。

test.cc


#include<iostream>
extern "C"{  // 重要,因为使用g++编译时函数名会改变,比方print_msg(const char*)
						 // 会编译成函数名 print_msg_char,这会导致python调用这个函数的时候
						 // 找不到对应的函数名,这有加了 extern "C",才会以C语言的方式进行
						 // 编译,这样不会改变函数名字
	void print_msg(const char* s)
	{
	   std::cout<<s<<std::endl;
	}
	
	int add_Integer(int a,int b)
	{
		return a+b;
	}
}
    

编译命令:

g++ -shared test.cc -o test.so -fPIC

-fPIC 的参数不能丢,PIC(Position Independent Code)表示生成代码与位置无关,这样才能

达到动态链接的目的。

script.py

#! /usr/bin/env/python
# _*_ encoding : utf-8 _*_

from ctypes import *
 
import os

sotest = cdll.LoadLibrary(os.getcwd()+ "/test.so")

	sotest.print_msg("hello,my shared object used by python!")
 
	print("4+5=%s" %sotest.add_Integer(4,5))

 

© 著作权归作者所有

木兰宿莽
粉丝 35
博文 12
码字总数 8250
作品 0
崇明
程序员
私信 提问
Python 调用 C 库的实现

在linux开发的动态链接库需要被python调用,首先需要生成.so文件。 生成动态链接库的方法网上有很多,这里就不用多说,主要就是首先根据源文件编译生成.o,然后链接这些.o文件-shared生成.so...

IBMdW
2011/03/28
1K
1
Python与C/C++ 模块相互调用

Python调用C动态链接库 Python调用C库很简单,不经过任何封装打包成so,再使用python的ctypes调用即可。 这里需要注意的是:使用g++编译生成动态库的代码中的函数 或者 方法时, 需要 使用exter...

晨曦之光
2012/04/12
23.7K
3
Python 与 C/C++ 交互的几种方式

python作为一门脚本语言,其好处是语法简单,很多东西都已经封装好了,直接拿过来用就行,所以实现同样一个功能,用Python写要比用C/C++代码量会少得多。但是优点也必然也伴随着缺点(这是肯...

吴金瑞
2018/06/26
0
0
基于ArcGIS的python编程 16、Python操作Oracle数据库 - 知乎

很多地理相关的处理都离不开对数据库的操作,对数据库的操作也是每一门语言必备的功能之一;python对数据库的操作对于不同的数据库也有对应的第三方类库,通过这些类库提供的方法,可以实现对...

基于ArcGIS的python编程
前天
0
0
在应用中嵌入Python

在应用中嵌入Python 翻译: gashero 前面的章节讨论如何扩展Python,如何生成适合的C库等。不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能。 Python嵌入实现了一些使用Pytho...

长平狐
2012/09/20
633
0

没有更多内容

加载失败,请刷新页面

加载更多

MongoDB系列-解决面试中可能遇到的MongoDB复制集(replica set)问题

关注我,可以获取最新知识、经典面试题以及微服务技术分享   MongoDB复制集(replica set):MongoDB复制集维护相同数据集的一组mongod进程,复制集是生产部署的基础,具有数据冗余以及高可用...

ccww_
21分钟前
2
0
SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache

前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache、RedisCache、ConcurrentMapCache等。 这一节我们来看看Spring Cache使用RedisCache。...

杨小格子
30分钟前
2
0
OpenJDK之CountDownLatch

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CountDownLatch是Doug Lea在JDK1.5中引入的,作用就不详细描述了, await()方法,如果还有线程在执行,那么当前线程...

克虏伯
36分钟前
2
0
简单编程

1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include<stdio.h>int main(){char name[3];char family[3];printf("Please input your name and family:\n...

电子工程197沈志初
41分钟前
4
0
详解Mysql分布式事务XA(跨数据库事务)

在开发中,为了降低单点压力,通常会根据业务情况进行分表分库,将表分布在不同的库中(库可能分布在不同的机器上)。在这种场景下,事务的提交会变得相对复杂,因为多个节点(库)的存在,可...

slagga
45分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部