在linux开发的动态链接库需要被python调用,首先需要生成.so文件。

生成动态链接库的方法网上有很多,主要就是首先根据源文件编译生成.o,然后链接这些.o文件-shared生成.so。需要注意的是,在编译链接生成动态库的时候一定要加-fPIC参数。而且如果在链接时需要链接其他库的话,必须保证其他库编译时也是加了-fPIC参数。这里笔者就是调用了mysql数据库libmysqlclient.a静态库,但是这个库没有加-fPIC编译,所以生成动态库的时候一直报错,说是需要加-fPIC重新编译。最后从网上下载了libmysqlclient的源码,然后加上-fPIC参数重新编译生成.a,问题才解决。

需要注意的是,libmysqlclient是使用cmake,该编译参数需要在CMakeList.txt文件里面修改编译参数加入-fPIC即可。

生成.so文件一定要将引用的其他库引用一起链接,如果不一起链接的话,在python调用的时候会报未定义错误。

生成动态链接库以后就可以在python里面调用了。

调用动态库可以使用ctypes和boost。本次笔者使用ctypes调用.so动态库函数。

调用的方法:

1.在python中引入ctypes:

import ctypes

2.加载动态库

lib_handle = ctypes.CDLL('./xxx.so')

3.关联动态库中的函数

func = lib_handle.func

4.使用函数

func(par1,par2)

需要注意的是,在动态库中定义的全局变量不能在python中这样直接引用,目前引用的方法笔者还没有研究出来。

文章来源:http://blog.csdn.net/garinwang/article/details/6281450

示例:

“test.cpp”

#include <stdio.h>

extern "C"{

void display(){

printf("This is Display Function\n");

}

}

==>g++ test.cpp –fPIC –shared libtest.so

“test.py”

import ctypes

so = ctypes.CDLL("./libtest.so")

so.display()

==>python test.py

Python 下调用C动态链接库 -- (转)的更多相关文章

  1. Python下调用Linux的Shell命令

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...

  2. c#下调用dll动态链接库[转]

    C# 调用传统的 API 动态链接库,是.NET开发经常被讨论的问题. 比如有这么一个动态链接库(delphi 语言): library DelphiDLL; uses SysUtils, Class ...

  3. python下调用c语言代码

    1)首先,创建一个.c文件,其大体内容如下: 2 #include <Python.h> 99 char * extract(char * path)                    ...

  4. Python下调用json.dumps中文显示问题解决办法

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,例如: import json js = json.loads('{"haha": & ...

  5. python下调用pytesseract识别某网站验证码

    一.pytesseract介绍 1.pytesseract说明 pytesseract最新版本0.1.6,网址:https://pypi.python.org/pypi/pytesseract Pyt ...

  6. python下调用不在环境变量中的firefox

    from selenium.webdriver.firefox.firefox_binary import FirefoxBinary binary = FirefoxBinary(r"D: ...

  7. asp.net下调用Matlab生成动态链接库

    对于这次论文项目,最后在写一篇关于工程的博客,那就是在asp.net下调用matlab生成的dll动态链接库.至今关于matlab,c/c++(opencv),c#(asp.net)我总共写了4篇配置 ...

  8. python学习--同目录下调用 (*.py)及不同目录下调(*.py)

    注:__init__.py 内容为空 1. 同目录下调用 (Contract_Statelog.py)  如图: temp1.py 调用 Contract_Statelog.py中的方法 2. 不同目 ...

  9. 使用ctypes在Python中调用C++动态库

    使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...

随机推荐

  1. Jenkins系列-Jenkins初始化配置

    初始化 访问,如:127.0.0.1:8088/Jenkins 第一次要求输入密码,初始密码在文件中查看. 执行以下命令查看 $ cat ${USER_HOME}\.jenkins\secrets\i ...

  2. CentOS修改DNS、IP地址、网关

    一.CentOS 修改DNS 修改对应网卡的DNS的配置文件 # vi /etc/resolv.conf 修改以下内容 nameserver 8.8.8.8 #google域名服务器 nameserv ...

  3. C#窗口文件双击打开时出错

    出错原因: 1. 修改了该窗口文件的.Designer.cs文件中:#region Windows 窗体设计器生成的代码这里面的代码,导致运行不正常. 为了传递数据,我在构造函数中增加了传递的值. 需 ...

  4. QT分析之消息事件机制

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201001432028526/ 上回我们分析到QPushButton的初始化,知道了Wi ...

  5. asp.net异步上传

    界面如下:

  6. BZOJ4773 负环(floyd+倍增)

    倍增floyd求出经过<=2k条边时两点间最短路,一个点到自身的最短路就是包含该点的最小环.然后倍增找答案即可.注意初始时到自身的最短路设为0,这样求出的最短路就是经过<=2k条边的而不是 ...

  7. CentOS 双网卡绑定实现平衡负载

    绑定两块网卡主要为了解决网卡故障.负载均衡等问题. 1.在vm加一块网卡,登录后检查网卡是否识别. 分别用ip addr和nmcli查看网卡的情况 [root@bigdata-senior01 ~]# ...

  8. 1 Easy Read/Write Splitting with PHP’s MySQLnd

    以下均是使用翻译软件翻译的! Note: This is part one in our Extending MySQL with PHP's MySQLnd Series, read part 2 ...

  9. 使用 XHProf 分析你的 PHP 程序

     个人说明: 注意: php5.5运行 xhprof_enable 会发生段错误Segmentation fault: ,这是一个已知的bug. 下面是报错测试脚本: function loader( ...

  10. ES6装饰器Decorator基本用法

    1. 基本形式 @decorator class A {} // 等同于 class A {} A = decorator(A); 装饰器在javascript中仅仅可以修饰类和属性,不能修饰函数.装 ...