Windows下面編譯Python指令碼為動態連結庫的方法
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 ./
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)
$ ./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], [[email protected]])
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