Windows下面编译Python脚本为动态链接库的方法

来源:互联网 发布:知大局精业务 信息化 编辑:程序博客网 时间:2024/06/06 16:47
假设相关文件都存放在 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/products/pyshield/patch/pyshield-patch.windows.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

全文完。