Python中使用C/C++模块有许多工具,大名鼎鼎的有SWIG(英文意思为:豪饮)、SIP(英文意思为:啜饮,小口的喝),还有boost.python等。其中SIP是从SWIG发展而来,专为Python调用C/C++模块使用的(看SIP的命名就能看出来,很有意思的)。
SIP的使用方法,在官网的SIP Reference Guide中有介绍,不过那是针对至少有点经验的人员,对初学者来说,想十分钟快速上手还是有点难度的。这里就介绍下本人在使用SIP总结的需要注意的地方。(本着方便大家方便自己的原则,欢迎转载,无需征得本人同意,但请注明出处,最好是原文连接,图个人气,谢谢!)
前提,本机上要装了Python、GCC(Windows下可以用MinGW,在我的Eclipse下配置CDT一文中有关于MinGW的安装介绍)、SIP(SIP的安装不难,可以对着SIP Reference Guide的Installation那一节做,安装SIP时就需要GCC了)。
1、首先,编写个C文件,功能是将两个数字相加并输出,命名为add.c,这个将成为在Python中的模块名,如下:
[cpp] view plaincopy /* File : add.c */ int add(int x, int y)
{ int g;g = x + y;return g;} 2、接着,手工编写SIP文件(类似C/C++的头文件,编写规范参考SIP Reference Guide,不难,有C/C++基础的人十几分钟就可以了,当然,你要懂鸟语),命名为add.sip,如下:
[plain] view plaincopy /* Define the SIP wrapper to the add library. */ %Module(name=add, language="C")
int add(int x, int y);3、编译C文件。按照官网的说法,是编写configure.py,但别急,先做一些必不可少的工作。在命令行将add.c编译成add.o文件:输入
[sql] view plaincopy gcc -c add.c接着,将这一步生成的add.o文件生产库文件:
[plain] view plaincopy ar -r libadd.a add.o将libadd.a文件复制到Python文件夹下的libs文件夹中(这两步在这里是为一个单独的C模块测试的,如果是大量的C模块,可以用一个makefile一并批量完成,这也是初学者容易模糊的地方)。
4、手工编写configure.py文件,同样,这个configure文件的编写也不难,看下规范就会了(要会鸟语……)。这里,我们模仿官网的模版写一个自己的configure.py.
[python] view plaincopy import os import sipconfig
# The name of the SIP build file generated by SIP and used by the build # system. build_file = "add.sbf"
# Get the SIP configuration information. config = sipconfig.Configuration()
# Run SIP to generate the code. os.system(" ".join([config.sip_bin, "-c", ".", "-b", build_file, "add.sip"]))
# Create the Makefile. makefile = sipconfig.SIPModuleMakefile(config, build_file)
# Add the library we are wrapping. The name doesn't include any platform # specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the # ".dll" extension on Windows)。
makefile.extra_libs = ["add"]
# Generate the Makefile itself. makefile.generate()
5、运行configure.py,会生成一个makefile文件(直接用IDLE打开configure.py,按F5运行;或者命令行用python configure.py运行都可以)。
6、在命令行输入make(这里会生成一个关于函数的警告,不用管它,我们是用来测试的……其他的应该没什么问题,若有问题请检查前面的步骤),生成add.pyd文件。然后再输入make install(将add.pyd文件装入到Python的Lib文件夹下的sit-packages文件夹中)。
7、打开Python 的命令行,进行测试:
[python] view plaincopy
>>>import add >>>add.add(4, 7)
11
>>>
(原谅我这么烂的模块名……)
提示:
(1)、这些文件可以放到Python的文件夹下新建的文件夹中(所有的操作在这个目录下的命令行窗口中使用)。注意,Python的父文件夹名不能有空格,否则会无法读取库文件。
(2)、使用MinGW,需要把~\MinGW\bin添加的环境变量中(Linux下则不必),这样才能使用gcc、make和ar等工具。
若还有什么注意的,我回继续补充。 |