Jython对应Java,IronPython对应C#和其他的.NET语言)。
Java类(JythonTest.java)
public class JythonTest { public void greeting() { System.out.println("Hello, world!"); } } $ javac JythonTest.java $ CLASSPATH=JythonTest.class jython # 使用 import JythonTest test = JythonTest() test.greeting()C#类(IronPythonTest.cs)
using System; namespace FePyTest { public class IronPythonTest { public void greeting() { Console.WriteLine("Hello, world!"); } } } # 编译 csc.exe /t:library IronPythonTest.cs # 更新环境变量,然后使用 import clr clr.AddReferenceToFile("IronPythonTest.dll") import FePyTest f = FePyTest.IronPythonTest() f.greeting()SWIG是简单包装盒接口生成器的缩写。
可通过它使用C语言或C++编写扩展代码;它会自动包装那些代码,一遍能在一些高级语言中使用。使用SWIG的过程很简单
为代码写接口文件为了自动的产生C语言代码(包装代码)要在接口文件上运行SWIG把原来的C语言代码和产生的包装代码一起编译来产生共享库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 - i]) 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接口文件(palindrome.i)
%module palindrome %{ #include <string.h> %} extern int is_palindrome(char *text);运行SWIG
swig -python palindrome.i # 产生两个新文件:palindrome_wrap.c,另一个是palindrome.py编译、连接以及使用
# Linux $ gcc -c palindrome.c $ gcc -I$PYTHON_HOME -I$PYTHON_HOME/Include -c palindrome_wrap.c $ gcc -shared palindrome.o palindrome_wrap.o -o _palindrome.so # Mac $ gcc -dynamic -I$PYTHON_HOME/Include/python2.5 -c palindrome.c $ gcc -dynamic -I$PYTHON_HOME/Include/python2.5 -c palindrome_wrap.c $ gcc -dynamiclib palindrome_wrap.o palindrome.o -o _palindrome.so -Wl, -undefined, dynamic_lookup使用
import _palindrome应用计数
宏Py_INCREF和Py_DECREF分别来增加和减少一个对象的引用计数。
/* 必须首先被包含 */ #include <Python.h> static PyObject *is_palindrome(PyObject *self, PyObject *args) { int i, n; const char *text; int result; if (!PyArg_ParseTuple(args, "s", &text)) { return NULL; } n = strlen(text); result = 1; for (i=0; i<=n/2; ++i) { if (text[i] != text[n-i-1]) { result = 0; break; } } return Py_BuildValue("i", result); } /* 方法/函数的列表 */ static PyMethodDef PalindromeMethods[] = { /* 名称、函数、参数类型和文档字符串 */ {"is_palindrome", is_palindrome, METH_VARARGS, "Detect palindromes"} /* 一个列表结束的标记: */ {NULL, NULL, 0, NULL} }; /* 初始化模块的函数(名称很重要) */ PyMODINIT_FUNC initpalindrome() { Py_InitModule("palindrome", PalindromeMethods); }然后编译
$ gcc -I$PYTHON_HOME -I$PYTHON_HOME/Include -shared palindrome2.c -o palindrome.so简单的Distutils安装脚本(setup.py)
from distutils.core import setup setup(name='Hello', version='1.0', description='A simple example', author='z', py_modules=['hello']) # 确保在同一目录下存在名为hello.py的模块文件使用sdist命令(用于 “源代码发布” )
python setup.py sdist假设已经在当前目录中放置了源文件palindrome2.c,下面的setup.py脚本可以用于编译(和安装):
from distutils.core import setup, Extension setup(name='palindrome', version='1.0', ext_modules = [ Extension('palindrome', ['palindrome2.c']) ])如果只想在当前目录编译扩展,可以使用以下命令:
python setup.py build_ext --inplace编译SWIG
from distutils.core import setup, Extension setup(name='palindrome', version='1.0', ext_modules = [ Extension('palindrome', ['palindrome.c', 'palindrome.i']) ])py2exe作为Distutils的扩展,可用来创建可执行的Windows程序。
# hello.py print 'Hello, world!' raw_input('Press<enter>') # 将hello.py放入空目录,然后创建setup.py from distutils.core import setup import py2exe setup(console=['hello.py']) # 运行脚本 python setup.py py2exe