29. Python脚本学习笔记二十九 扩展Python以及SWIG
本篇名言:“挥别昨日的伤痛,得来今天的美好,摔掉今天的烦恼,相信明天会更好,每一个挑战都靠自己打倒,每一个幸福都靠双手捉牢!”
Python几乎可以实现一切,但是有时候会显得太慢,比如对迪斯尼电影进行渲染。那么使用Python编写高性能的代码可能不是好的选择。
其实这个就是使用Python的代码,毕竟这个世界上还没有存在一个即灵活好用又性能杠杠的语言。鱼和熊掌不能兼得。
C语言可以提高程序本身的运行速度,但是会让开发速度变慢。
很多场景可以使用如下方法:
1、 在Python中开发一个原型程序
2、 分析程序并且找到瓶颈
3、 用C语言或者C++,C#,JAVA,Fortan等扩围扩展来重写瓶颈的代码
如果需要为交互的硬件的特殊部分编写低级代码,那么除了C外别无选择。
1、 Jython和IronPython
1.1 Jython访问java类
Jython对应Java,IronPython对应C#和其他的.NET语言。
先来看下Jython,从http://www.jython.org/downloads.html下载Jython.
然后使用命令java –jarjython-install-2.7.0.jar 进行安装。
Jython示例如下:
创建文件JythonTest.java
如下:
public class JythonTest {
public void greeting() {
System.out.println("Hello, world!");
}
}
然后使用javac JythonTest.java进行编译,得到JythonTest.class文件。
接着启动jython.
输入如下,
>>> import JythonTest
>>> test=JythonTest()
>>> test.greeting()
Hello, world!
这样就是实现了Python访问java类的过程。
1.2 IronPython访问C#中的类
我们再来看下IronPython实现
先编辑一个CS文件IronPython.cs文件如下:
using System;
namespace FePyTest {
public class IronPythonTest{
public void greeting() {
Console.WriteLine("Hello, world!");
}
}
}
然后编译生成dll动态链接库如下:
E:\ >C:\Windows\Microsoft.NET\Framework\v3.5\csc/t:library IronPythonTest.cs
适用于 Microsoft(R) .NET Framework 3.5 版的 Microsoft(R)Visual C# 2008 编译器 3
.5.30729.5420
版版权所有(C)Microsoft Corporation。保留所有权利。
就得到了dll文件。
然后在http://ironpython.codeplex.com/路径下 下载IronPython安装包
安装后。调用IronPython,输入以下代码:
>>>import clr
>>> clr.AddReferenceToFileAndPath("IronPythonTest.dll")
>>> import FePyTest
>>> f=FePyTest.IronPythonTest()
>>> f.greeting()
Hello, world!
这样就实现了Python调用C#中的类。
2、 C语言扩展
很多时候扩展Python,其实就是指扩展CPython。由于在编写Python的C语言扩展时必须严格遵守API。为了简化编写C语言扩展的过程,最有名的是SWIG。
3、 SWIG扩展
SWIG是简单包装和接口生成器的缩写。能用于几种语言。当需要一些不同语言编写的子系统协同工作时,就非常有用。
通过地址:http://www.swig.org/download.html进行下载。解压即可。。
在Python中使用现存的C语言代码是SWIG的主要用途。
具体使用SWIG过程如下:
1、 为代码写接口文件,类似C语言的头文件
2、 在接口文件上运行SWIG
3、 把C语言代码和产生的包装代码一起编译
我们来看个例子如下:
3.1 编写接口文件
接口文件声明要导出的所有函数和变量。
Palindrome.i如下
%module palindrome
%{
#include <string.h>
%}
extern int is_palindrome(char *text);
3.2 实现C语言函数
Palindrome.c文件如下:
#include <string.h>
int is_palindrome(char *text) {
int i, n=strlen(text);
for (i=0; i<=n/2; ++i) {
if (text[i] != text[n-i-1])return 0;
}
return 1;
}
3.3 运行SWIG
运行swig如下:
E:\>swig -python palindrome.i
然后会产生两个文件palindrome_wrap.c 和,palindrome.py.
其中-python是参数,确保SWIG包装C语言代码,以便能在Python中使用。
3.4 编译运行
在Python的根目录的include子目录中找到pyconfig.h和Python.h这两个头文件。
可以再路径:
Windows如下:
E:\>gcc -c palindrome.c
E:\>gcc -ID:\python27\include -c palindrome_wrap.c
E:\ >gcc -shared palindrome.o palindrome_wrap.o
D:\python27\libs\libpython27.a -o _palindrome.dll
最后得到_palindrome.dll(蛤蟆在此处编译报错无法通过)
在Linux下编译如下,需要安装 python-devel包。
#gcc -fPIC -c palindrome.c
# gcc -fPIC -I/usr/include/python2.6 -cpalindrome_wrap.c
]# gcc -shared palindrome.o palindrome_wrap.o -o palindrome.so
最后在python中实验如下:
>>> import _palindrome
>>> dir(_palindrome)
['SWIG_PyInstanceMethod_New', '__doc__','__file__', '__name__', '__package__', 'is_palindrome']
>>>_palindrome.is_palindrome('ipreferpi')
1
>>> _palindrome.is_palindrome('notlob')
0
成功实现了,用Python扩展C代码。
4、 其他Python相关工具
4.1 Psyco
Psyco是Python的一个特定的实时编译器。
4.2 Pyrex
是一种Python的方言,专门为编写Python的扩展模块而设计的语言。
4.3 PyPy
是一个新的Python实现,通过相当高阶的代码分析和翻译,有望胜过Python.
4.4 Weave
是SciPy发布的一部分,是一个直接在你的Python代码中包含C语言或者C++代码的工具。
4.5 NumPy
提供了访问数字数组的功能。
4.6 Ctypes
导入已存在的C语言库。
4.7 Subprocess
是标准库中的一个模块,连同有着相似功能的旧的模块和函数,允许Python运行外部程序,并且能通过命令行参数、标准输入/输出和错误流与外部程序通信。
4.8 PyCXX
是一个便携Python 扩展的C++工具集。
4.9 SIP
原先是一个用于开发GUI包的PyQt的工具,包括一个代码生成器和一个Python模块。
4.10 Boost.Python
用于在Python和C++之间进行良好的互操作。
4.11 Modulator
用于生成一些C语言扩展需要的样板代码。