29. Python脚本学习笔记二十九 扩展Python以及SWIG

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这两个头文件。

可以再路径:

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/rubenvb/gcc-4.8-release/x86_64-w64-mingw32-gcc-4.8.0-win64_rubenvb.7z/download中下载gcc for windows

 

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语言扩展需要的样板代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值