17.2 非常简单的途径:Jython 和 IronPython
一个简单的java类
public class JythonTest{
public void greeting(){
System.out.println("Hello,world"):
}
}
java编译器编译,例如javac
$javac JythonTest.java
如果使用java工作,那么可以使用jythonc命令把Python类编译成Java类,这样的Java类能直接导入到Java程序中。
已经编译了这个类之后,就自动启动Jython:
$CLASSPATH=JythonTest.class jython
之后直接导入这个类:
>>>import JythonTest
>>>test = JythonTest()
>>>test.greeting()
Hello,world!
17.3.1 SWIG
SWIG是简单包装和接口生成器的缩写。
1.它是做什么的
使用SWIG的过程是简单的,首先要确保一些C语言代码
1.为代码写接口文件,这很像C语言的头文件
2.为了自动的产生C语言代码要在接口文件上运行SWIG
3.把原来的C语言代码和产生的包装代码一起编译来产生共享库。
2.更喜欢Pi
回文是忽略掉空格和标点后,正着读反着读都一样的句子。
一个简单的用来检测回文的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;
}
python版本的检测回文的函数
def is_palindrome(text):
n = len(text)
for i in range(len(text)//2):
if text[i] != text[n-i-1]:
return False
return True
3.接口文件
把接口描述放到palindrome.i中。
如果定义了头文件palindrome.h,SWIG就可以从头文件中得到需要的信息。因此如果拥有一个头文件,可以随意使用它。显示地编写一个接口文件的理由之一是知道SWIG是怎么包装代码的。最终要的是排除一些东西,比如,如果要包装一个巨大的C语言库,可能需要导出一些函数到Python中,在这种情况下,只要把需要导出的函数放到接口文件中就可以了。
在接口文件中,就像在一个头文件中做得那样,只需声明要导出的所有的函数即可,除此之外,头部的一个单元内,可以指定包含的头文件以及在这之前的一个%module声明,即为模块定义的一个名字。
回文库的接口
%module palindrome
%{
#include <string.h>
%}
extern int is_palindrome(char *text):
4.运行SWIG
$swig -python palindrome.i
之后会得到两个新文件-----palindrome_wrap.c palindrome.py
5.编译、连接以及使用
$gcc -c palindrome.c
$gcc -I$PYTHON_HOME -I$PYTHON_HOME/Include -c palinrome_wrap.c
$gcc -shared palindrome.o palindrome_wrap.o -o _palindrome.so
可能需要的所有文件在 比如/usr/include/python2.6
$gcc -c palindrome.c
$gcc -I/usr/include/python2.6 -c palindrome_wrap.c
$gcc -shared palindrome.o palindrome_wrap.o -o _palindrome.so
在运行了这些不可思议后,会得到一个很有用的文件_palindrome.so。这就是共享库它能直接导入python
>>>import _palindrome
>>>dir(_palindrome)
['__doc__','__file__','__name__','is_palindrome']
>>>_palindrome.is_palindrome('ipreferpi')
1
>>>_palindrome.is_palindrome('notlob')
0
6.一条通过编译器的魔法森林的捷径
使用Distutils 可以优雅的避免那些配置。Distutils直接支持SWIG。
引用计数
使用两个宏Py_INCREF和Py_DECREF分别增加和减少一个对象的引用计数。