1. 程式人生 > >Windows下面編譯Python指令碼為動態連結庫的方法

Windows下面編譯Python指令碼為動態連結庫的方法

假設相關檔案都存放在 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], [[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

全文完。