inushome 发表于 2015-11-29 11:51:15

用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:\Python34\lib\ctypes\__init__.py", line 364, in __getattr__
func = self.__getitem__(name)
File "E:\Python34\lib\ctypes\__init__.py", line 369, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'max' not found

  
  编译生成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

  
  顿时感觉打开了新世界的大门
页: [1]
查看完整版本: 用python调用C的动态链接库