Python调用C库文件的两种方法

1. 使用dlopen函数调用库文件然后编译成python扩展库

1) $ vim func.c

#include <stdio.h>

int sum(int a, int b){
    printf("%d+%d=", a, b);
    return a+b;
}

2)$ gcc -o libfunc.so -shared -fPIC func.c

3) $ vim mydlopen.c

#include <Python.h>
#include <dlfcn.h>
#include <stdio.h>
#include <time.h>
#include <string.h>

#define LIBPATH "/root/test/libfunc.so"

const int (*funcSum)(int a, int b);

static PyObject *getSum(PyObject *self, PyObject *args)
{
    int a=0;
    int b=0;

    if (!PyArg_ParseTuple(args, "ii", &a, &b))
    {
            PyErr_SetString(PyExc_TypeError, "parms error");
            return NULL;
    }
    void *handle =  dlopen(LIBPATH, RTLD_LAZY);
    if (handle == NULL)
    {
        return NULL;
    }
    funcSum =  dlsym(handle,"sum");
    int sum = funcSum(a, b);
    return Py_BuildValue("i", sum);
}

static PyMethodDef myMethods[] = {
        {"getSum", getSum, METH_VARARGS},
        {NULL, NULL}
};

void initmydlopen() {
        Py_InitModule("mydlopen", myMethods);
}

4) $ vim setup.py

from distutils.core import setup, Extension
MOD = "mydlopen"
setup(name=MOD,
      packages=[],
      ext_modules=[Extension(MOD,
                             sources=["mydlopen.c"],
                             include_dirs=["/usr/include"],
                             library_dirs=["/usr/lib64"],
                             libraries=["dl"])])

5)$ python setup.py install

running install
running build
running build_ext
building 'mydlopen' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/include -I/usr/local/include/python2.7 -c mydlopen.c -o build/temp.linux-x86_64-2.7/mydlopen.o
mydlopen.c:36: 警告:函数声明不是一个原型
gcc -pthread -shared build/temp.linux-x86_64-2.7/mydlopen.o -L/usr/lib64 -L/usr/local/lib -ldl -lpython2.7 -o build/lib.linux-x86_64-2.7/mydlopen.so
running install_lib
copying build/lib.linux-x86_64-2.7/mydlopen.so -> /usr/local/lib/python2.7/site-packages
running install_egg_info
Removing /usr/local/lib/python2.7/site-packages/mydlopen-0.0.0-py2.7.egg-info
Writing /usr/local/lib/python2.7/site-packages/mydlopen-0.0.0-py2.7.egg-info

6)$ python

Python 2.7.13 (default, Jun 27 2017, 13:39:52) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mydlopen
>>> mydlopen.getSum(1,3)   
1+3=4

2. 利用ctypes库直接调用库文件

1)$ python

Python 2.7.13 (default, Jun 27 2017, 13:39:52) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> dl = ctypes.cdll.LoadLibrary
>>> lib = dl("./libfunc.so")    
>>> lib.sum(1,4)
1+4=5
PythonPython可以Python可以通过Python可以通过调Python可以通过调用Python可以通过调用CPython可以通过调用C代码Python可以通过调用C代码实Python可以通过调用C代码实现Python可以通过调用C代码实现更Python可以通过调用C代码实现更高Python可以通过调用C代码实现更高效Python可以通过调用C代码实现更高效的Python可以通过调用C代码实现更高效的算Python可以通过调用C代码实现更高效的算法Python可以通过调用C代码实现更高效的算法和Python可以通过调用C代码实现更高效的算法和处理Python可以通过调用C代码实现更高效的算法和处理速Python可以通过调用C代码实现更高效的算法和处理速度Python可以通过调用C代码实现更高效的算法和处理速度。Python可以通过调用C代码实现更高效的算法和处理速度。具Python可以通过调用C代码实现更高效的算法和处理速度。具体Python可以通过调用C代码实现更高效的算法和处理速度。具体可以Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用PythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用PythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Python的ctPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用PythonctypesPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用PythonctypesPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者CPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者CythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用CPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypesPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypesPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成PythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成PythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python可调Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而CPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而CythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写CPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写PythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写PythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python的扩Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让PythonPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用CPython可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,提Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,提高Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,提高程序Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,提高程序运Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,提高程序运行Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,提高程序运行Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,提高程序运行效率Python可以通过调用C代码实现更高效的算法和处理速度。具体可以使用Pythonctypes模块或者Cython来调用C代码。ctypes模块可以将函数中的函数生成Python调用的函数对象,而Cython则是通过编写C的语法来编写Python扩展模块。这两种方式都可以让Python程序调用C代码,提高程序运行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值