本文以将C语言函数接口封装为Python下的接口为例进行介绍。系统环境winXP 32。
一、软件安装
(1)安装Python
下载地址:https://www.python.org/getit/,版本2.7.9;点击python-2.7.9.msi进行安装,安装在C:\Python27目录下;设置环境变量:我的电脑--控制面板--系统--高级--环境变量--在用户变量下找到PATH--编辑--在变量值中填入C:\Python27。
(2)安装swigwin
下载地址:http://www.swig.org/download.html,版本3.0.12;解压在C:\swigwin-3.0.12目录下,并设置环境变量:……在用户变量下找到PATH--编辑--在变量值中填入C:\swigwin-3.0.12。
二、简单举例
让我们以一个简单举例入手,在Windows下将C函数制作成DLL库,并将其封装成Python的一个Module,然后再Python中import这个Module,然后再Python中调用这个Module中的函数。
(1)新建VS2010工程
打开VS2010,新建Win32 Console Application,在Application Settings中选择DLL以及空项目。完成后将工程配置改为Release,如若不改后面编译会出错(因为我下载的Python是Release版的,而非Debug版)。
(2)在工程中新建example.c(内容为swigwin-3.0.12\Examples\python\simple\example.c)
(3)在工程中新建 example.i(内容为swigwin-3.0.12\Examples\python\simple\example.i)
(4)修改example.i的属性
选中example.i--右键--属性--常规--选择自定义生成工具;
选中example.i--右键--属性--自定义生成工具--常规:
命令行:
echo In order to function correctly, please ensure the following environment variables are correctly set:
echo PYTHON_INCLUDE: %PYTHON_INCLUDE%
echo PYTHON_LIB: %PYTHON_LIB%
echo on
C:\swigwin-3.0.12\swig.exe -python“%(FullPath)”
输出:
$(InputName)_wrap.c
(5)编译example.i
选中example.i--右键--编译,将产生example.py和example_wrap.c,将example_wrap.c加入工程。
在Python中使用import example就会去加载example.py文件。而example.py文件的第一句就是import _example,_example是什么呢,就是我们要制作的一个动态库,即我们要把Swig生成的example_wrap.c和自己编写的example.c放在一起制作一个名为_example.pyd的动态库来。
注意:步骤(4)(5)也可以不在VS2010下进行,改为在DOS命令行进行,即步骤(4)(5)可以被如下操作代替:
在开始--运行--输入cmd进入DOS命令行,
切换到example.c所在的目录命令cd C:\ swigwin-3.0.12\Examples\python\simple\example.c,
然后编译example.i,命令swig -python example.i。
(6)设置Python库的环境变量
我的电脑--控制面板--系统--高级--环境变量--新建,变量名和值分别为如下两组:
PYTHON_INCLUDE: C:\python27\include
PYTHON_LIB: C:\python27\libs\python27.lib
因为example_wrap.c文件中会用到python.h (包含)和python21.lib(链接)。
(7)修改VS2010工程的配置属性
选择项目--属性即可打开属性页。
C/C++--常规--附加包含目录:$( PYTHON_INCLUDE)
链接器--常规--输出文件:_example.pyd
连接器--输入--附加依赖项:$( PYTHON_LIB)
(8)编译整个工程。
将生成的example.py和_example.pyd拷贝出来即可在Python中使用。
(9)动态库在Python中的使用
将生成的example.py和_example.pyd拷贝到D:\test目录下。
打开DOS命令行,执行如下操作:
切换到D盘
>D:
>cd D:\test
进入python交互命令行
>python
>>>import example
>>>x = 42
>>>y = 105
>>>g = example.gcd(x, y)
>>>print "The gcd of %d and %d is %d" % (x, y, g)
The gcd of 42 and 105 is 21
>>>print "Foo = ", example.cvar.Foo
Foo = 3.0
>>>example.cvar.Foo = 3.1415926
>>>print "Foo = ", example.cvar.Foo
Foo = 3.1415926
参考:
(1)SWIG的使用教程
https://wenku.baidu.com/view/8f4bab73001ca300a6c30c22590102020740f2c4.html
(2)用C编写Python扩展找不到Python27_d.lib
http://blog.sina.com.cn/s/blog_75e9551f0101aajd.html
https://blog.csdn.net/junparadox/article/details/52704287
(3)windows下使用swig
https://blog.csdn.net/A8572785/article/details/10427521
(4)如何实现 C/C++ 与 Python 的通信?
https://www.zhihu.com/question/23003213
(5)在Win7环境下,利用SWIG实现Python调用C的方法
https://blog.csdn.net/cuiqiang1990csdn/article/details/45310821
(6)利用 SWIG 对 C++ 库进行 Python 包装
https://segmentfault.com/a/1190000013219667?utm_source=tag-newest
(7)swig入门
https://blog.csdn.net/zhangzq86/article/details/78836309
(8)PYTHON调用C语言函数
https://coolshell.cn/articles/671.html
https://www.cnblogs.com/zhsuiy/p/4798642.html
(9)c#利用SWIG调用c++dll学习总结
https://blog.csdn.net/liu14lang/article/details/78882539