Windows下面编译Python脚本为动态链接库的方法 2012-04-09 10:18:57| 分类: 技术 | 标签:python cython dll |字号大中小 [url=]订阅[/url]
假设相关文件都存放在 C:/test
Cython-0.15.1.tar.gz
pyshield-patch.windows.python23.tar.gz
test.py
test_vit.py
scripts.tar.gz
其中 pyshield-patch.windows.python23.tar.gz 可以从这里下载:http://www.dashingsoft.com/produ ... ows.python23.tar.gz
Cython-0.15.1.tar.gz 可以从 cython.org 下载,
scripts.tar.gz 解压后包含下列文件:
configure.ac
makefile.am
genconf.sh
文件内容参考附录。
test.py test_vit.py 是任意的测试脚本。
1. 安装 cygwin,下列包必须安装
autoconf,automake,libtool,gcc-3, make, mingw-32, python
2. 双击cygwin图标进入 cygwin 环境,执行下列命令,安装 cython
$ cp /cygdrive/c/test/Cython-0.15.1.tar.gz ./
$ tar xzf Cython-0.15.1.tar.gz
$ cd Cython-0.15.1
$ python -E setup.py install
3. 解压编译脚本和辅助文件到当前目录,拷贝需要转换的Python模块到当前目录,(假设工作目录是 $HOME)
$ cd ~
$ tar xzf /cygdrive/c/test/scripts.tar.gz
$ cp /cygdrive/c/test/test.py ./
$ cp /cygdrive/c/test/test_vit.py ./
$ tar xzf /cygdrive/c/test/pyshield-patch.windows.python23.tar.gz
4. 运行cython转换 py 成为 c文件。
$cython -2 test.py
$cython -2 test_vit.py
5. 如果还有其他模块,可以参考 Makefile.am 增加相应的内容。
一是在行
lib_LTLIBRARIES = libtest.la libtest_vit.la
后面增加 libNEW.la, 例如
lib_LTLIBRARIES = libtest.la libtest_vit.la libnew_test.la
二是增加相应的行
libnew_test_la_SOURCES = new_test.c
libnew_test_la_CPPFLAGS = $(MYCPPFLAGS)
libnew_test_la_LDFLAGS = $(MYLDFLAGS) -l$(LIBPYTHON)
libnew_test_la_LIBADD = $(LTLIBOBJS)
6. 生成 make 文件,这可能需要3分钟时间,尤其是第二条命令。
$ ./genconf.sh
$ ./configure
7. 运行 make ,生成扩展模块
$ make
$ ls .libs
生成的文件存放 .libs 子目录下面,一般是cyg为前缀,版本号为后缀
cygtest-0.dll
cygtest_vit-0.dll
8. 修改名称为 pyd ,拷贝到发布目录即可。
$ cp .libs/cygtest-0.dll /cygdrive/c/test/test.pyd
$ cp .libs/cygtest_vit-0.dll /cygdrive/c/test/test_vit.pyd
如果Python脚本更新之后,需要执行第四步重新生成 .c 源文件,然后执行第七步make即可。
如果需要增加新的模块,那么需要修改Makefile.am,然后需要执行第六步,重新生成 makefile文件。
上面的示例是针对Python2.3版本的,如果需要发布到其他版本,例如 2.6,那么
a. 修改 configure.ac
替换 AC_SUBST([PYTHON_VERSION], [2.3]) 为 AC_SUBST([PYTHON_VERSION], [2.6])
b. 下载 pyshield-patch.windows.python26.tar.gz 并解压到$HOME目录,下载地址和解压方式可参考上面示例(替换23为26即可)
c. 执行示例的第六步,重新生成 makefile文件
然后就可以调用 make 来创建python26的扩展模块了。
如果需要发布到python3000以后的版本,除了上面的修改,还需要在第四步使用 -3 参数,例如
$ cython -3 test.py
$ cython -3 test_vit.py
附录:
Makefile.am 内容:
AUTOMAKE_OPTIONS = foreign no-dependencies
# The source files
lib_LTLIBRARIES = libtest.la libtest_vit.la
libtest_la_SOURCES = test.c
libtest_la_CPPFLAGS = $(MYCPPFLAGS)
libtest_la_LDFLAGS = $(MYLDFLAGS) -l$(LIBPYTHON)
libtest_la_LIBADD = $(LTLIBOBJS)
libtest_vit_la_SOURCES = test_vit.c
libtest_vit_la_CPPFLAGS = $(MYCPPFLAGS)
libtest_vit_la_LDFLAGS = $(MYLDFLAGS) -l$(LIBPYTHON)
libtest_vit_la_LIBADD = $(LTLIBOBJS)
ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = config.rpath m4/ChangeLog
PYTHON_VERSION_NODOT := $(subst .,,$(PYTHON_VERSION))
MYCPPFLAGS=-I./windows/python$(PYTHON_VERSION_NODOT)/include
MYLDFLAGS=-L./windows/python$(PYTHON_VERSION_NODOT) -no-undefined
LIBPYTHON=python$(PYTHON_VERSION_NODOT)
confgiure.ac 内容
AC_PREREQ([2.60])
AC_INIT([cytest], [1.0.0], [jondy.zhao@gmail.com])
AC_CONFIG_MACRO_DIR([m4])
AC_SUBST([PYTHON_VERSION], [2.3])
CC=gcc-3
CFLAGS="-mno-cygwin"
AM_INIT_AUTOMAKE
AC_C_INLINE
AC_LIBTOOL_WIN32_DLL
AC_PROG_LIBTOOL
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
genconf.sh 内容:
libtoolize
aclocal -I m4
autoconf
automake --add-missing
全文完。
|