zoukankan      html  css  js  c++  java
  • 用python调用C的动态链接库

      暂时Python写得不好,有些东西还是用C写起来顺手,遇到这种情况怎么办呢…于是学习了一下python调用C动态链接库的方法。这样就可以将用C写好的函数提供给python使用了。

      首先要将先新建个DLL工程。例如我新建了dlllearning工程,内包含example.h和example.cpp两个文件。

      代码如下:

     1 //example.h
     2 #ifndef EXPORT_EXAMPLE_DLL
     3 #define EXAMPLE_API __declspec(dllimport)
     4 #else
     5 #define EXAMPLE_API __declspec(dllexport)
     6 #endif
     7 
     8 
     9 extern "C" {
    10     EXAMPLE_API int max(int, int);
    11     EXAMPLE_API int min(int, int);
    12 }
     1 //example.cpp
     2 #define EXPORT_EXAMPLE_DLL
     3 #include "example.h"
     4 
     5 EXAMPLE_API int max(int a, int b) {
     6     return a > b ? a : b;
     7 }
     8 
     9 EXAMPLE_API int min(int a, int b) {
    10     return a < b ? a : b;
    11 }

    关于__declspec(dllimport)的作用可以参考这篇博文:http://blog.csdn.net/mniwc/article/details/7993361

    注意extern "c"是必须的,如果按照C++编译的话会有意想不到的问题发生,提示如下:

    Traceback (most recent call last):
        mx = dlllearning.max(a, b)
      File "E:Python34libctypes\__init__.py", line 364, in __getattr__
        func = self.__getitem__(name)
      File "E:Python34libctypes\__init__.py", line 369, in __getitem__
        func = self._FuncPtr((name_or_ordinal, self))
    AttributeError: function 'max' not found
    [Finished in 0.2s]

    编译生成dll文件,我们用python调用一下看看。

    1 from ctypes import *
    2 dlllearning = cdll.LoadLibrary('dlllearning.dll')
    3 a = 413
    4 b = 52
    5 mx = dlllearning.max(a, b)
    6 mn = dlllearning.min(a, b)
    7 print(mx, mn)

    输出结果:

    413 52
    [Finished in 0.2s]

    顿时感觉打开了新世界的大门

  • 相关阅读:
    mysql执行update报错 Err] 1055
    scp从远程指定目录拷贝文件到本地指定目录
    内存溢出
    BlockingQueue-----多线程(一)
    版主
    Mybatis学习总结-----mybatis中refid是什么意思(十)
    Mybatis学习总结--------Mybatis <where>标签 (九)
    @RequestMapping 和 @GetMapping @PostMapping 区别
    @RequiresPermissions ,@RequiresUser , @RequiresGuest ,@RequiresRoles 解释
    response.setHeader的各种用法 ------ 笔记(一)
  • 原文地址:https://www.cnblogs.com/kirai/p/4798830.html
Copyright © 2011-2022 走看看