用 SWIG 生成 TidyLib 的 Python 扩展
-----------------------------------------
Created by : Andrew.Wu
Created on : 2009/03/29
-----------------------------------------
一、
建立一个单独的工作目录, 复制 tidy/include 所有头文件到这个目录。以下文件也同在这个目录
二、
文件 pytidy.i
%module "pytidy" %include "cpointer.i" %include "carrays.i" %{ #define _LIB 1 #define SUPPORT_UTF16_ENCODINGS 1 #define SUPPORT_ASIAN_ENCODINGS 1 #define SUPPORT_ACCESSIBILITY_CHECKS 1 #include "platform.h" #include "tidyenum.h" #include "buffio.h" #include "tidy.h" %} %include "platform.h" %include "tidyenum.h" %include "buffio.h" %include "tidy2.h" %pointer_functions(uint, uintp); %pointer_functions(char, charp); %pointer_functions(byte, bytep); %array_class(byte, byteArray); %array_class(char, charArray); %import tidy.h
注意 pytidy.i 中的 %include "tidy2.h" 。 因为直接使用 %include "tidy.h" 编译时会有一些冲突, 所以增加了tidy2.h。tidy2.h 是 tidy.h 的 copy,只是注释了struct _TidyAllocatorVtbl 。
三、
文件 SContruct
import os,shutil env = Environment() env.Append(ENV = os.environ) env.Append( CXXFLAGS = Split("/EHsc /MD"), CPPDEFINES = [ 'WIN32', '_WINDOWS', '_USRDLL', 'PYTIDY_EXPORTS', 'SUPPORT_UTF16_ENCODINGS', 'SUPPORT_ASIAN_ENCODINGS', 'SUPPORT_ACCESSIBILITY_CHECKS' ], CPPPATH = [ r'C:/Script/Python26/include', r'C:/libs/tidy/include' ], LIBPATH = [ r'C:/Script/Python26/libs', r'C:/libs/tidy/libs' ], LIBS = ['libtidy.lib'], SWIGFLAGS = ['-c++', '-python'], #SWIGFLAGS = ['-python'], SHLIBSUFFIX = [''] ); input_files = [ 'pytidy.i', ] s = env.SharedLibrary('_pytidy.dll', input_files) def DllToPyd(**v): dll = str(v["target"][0]); pyd = dll.replace(".dll", ".pyd"); shutil.move(dll, pyd) env.AddPostAction(s, env.Action(DllToPyd))
四、
在 Visual Studio 2008 Command Prompt 使用 scons.py 编译
五、
import pytidy
六、
Tidy 是从 cvs 下载的,版本 $Date: 2008/12/07 21:08:48 $ $Revision: 1.45 $ (tidy/src/version.h)
SCons 版本 v1.2.0.d20090113.r3897 (scons.py --version)
SWIG 版本 swigwin-1.3.38
Python 版本 2.6.1
编译器 是 vc2008 + sp1
七、
另一个 tidy python 扩展 是mxTidy( http://www.egenix.com/products/python/mxExperimental/mxTidy/ ), 但目前只支持到python 2.5