Distutils發佈C++擴展的Python模塊

Distutils的API參閱https://docs.python.org/2/distutils/apiref.html

本地生產python模塊,動態庫

python2.7 setup.py build_ext --inplace

python2.7 setup.py build_ext --inplace

在相應python版本安裝

pyana27 setup.py install   (alias pyana27="/root/anaconda2/bin/python")

python3.6 setup.py install

擴展模塊:

描述擴展模塊由setup函數的關鍵字參數ext_modules實現。ext_modules是Extension實例的列表,每一個Extension實例描述了一個獨立的擴展模塊,擴展模塊可以設置擴展包名,頭文件、源文件、鏈接庫及其路徑、宏定義和編輯參數等,英文原文鏈接:

英文鏈接:https://docs.python.org/2/distutils/setupscript.html#describing-extension-modules

1.包名

name:指定擴展包名稱

1.頭文件

include_dirs: 指定頭文件

Extension('foo', ['foo.c'], include_dirs=['include'])
Extension('foo', ['foo.c'], include_dirs=['/usr/include/X11'])

2.源文件

sources:指定源文件,可以是c、c++、Objective-C、*.i,文件

2.

define_macros:定義宏

undef_macros:取消宏定義

Extension(...,
          define_macros=[('NDEBUG', '1'),
                         ('HAVE_STRFTIME', None)],
          undef_macros=['HAVE_FOO', 'HAVE_BAR'])
相當於每個c文件頭部有:

#define NDEBUG 1
#define HAVE_STRFTIME
#undef HAVE_FOO
#undef HAVE_BAR
3.庫

libraries:要鏈接的庫的列表

library_dirs:鏈接時,搜索鏈接庫的路徑列表

runtime_library_dirs :運行時,搜索動態庫的路徑列表

Extension(...,
          library_dirs=['/usr/X11R6/lib'],
          libraries=['X11', 'Xt'])
4.編譯鏈接附加命令行選項

extra_link_args

extra_compile_args


Distutils可以進行擴展,比如增加新的命令、修改現有的命令。可參閱https://docs.python.org/2/distutils/extending.html


e.g.

---------------------------------------------------------------手動版本

swig -c++ -python recognition.i

g++ -std=c++11 -DHAVE_ATLAS -O2 -fPIC -I/usr/wxf/kaldi/src/ -I/usr/wxf/kaldi/tools/openfst/include -I/usr/wxf/kaldi/tools/ATLAS/include -c recognition.cc

g++ -std=c++11 -DHAVE_ATLAS -O2 -fPIC -c recognition_wrap.cxx -I/usr/wxf/kaldi/src/ -I/usr/wxf/kaldi/tools/openfst/include -I/usr/wxf/kaldi/tools/ATLAS/include -I/root/anaconda3/include/python3.6m\

g++ -std=c++11 -Wall -msse -msse2 -pthread -shared -DKALDI_DOUBLEPRECISION=0 -DHAVE_EXECINFO_H=1 -DHAVE_CXXABI_H -DHAVE_ATLAS -O2 -fPIC -L/root/anaconda3/lib -Wl,-rpath=/root/anaconda3/lib -lpython3.6m -Wl,-rpath=/usr/wxf/kaldi/tools/openfst/lib /usr/wxf/kaldi/tools/openfst/lib/libfst.so -Wl,-rpath=/usr/lib64/atlas /usr/lib64/atlas/libsatlas.so.3 -Wl,-rpath=/usr/wxf/kaldi/src/lib -L/usr/wxf/kaldi/src/lib -lkaldi-base -lkaldi-hmm -lkaldi-ivector -lkaldi-feat -lkaldi-transform -lkaldi-gmm -lkaldi-tree -lkaldi-util -lkaldi-matrix recognition.o recognition_wrap.o -o _recognition.so



---------------------------------------------------------------Distutils版本

#!/usr/bin/env python  
 
"""  
setup.py file for SWIG C\+\+/Python recognition
"""  
from distutils.core import setup, Extension  
recognition_module = Extension('_recognition',
    sources=['recognition.i', 'recognition.cc'],
    include_dirs=['/usr/wxf/kaldi/src/', '/usr/wxf/kaldi/tools/openfst/include', '/usr/wxf/kaldi/tools/ATLAS/include'],
    swig_opts=['-c++'],
        libraries=['fst', 'satlas','kaldi-base', 'kaldi-hmm', 'kaldi-ivector', 'kaldi-feat', 'kaldi-transform', 'kaldi-gmm', 'kaldi-tree', 'kaldi-util', 'kaldi-matrix'],

    #libraries=['libfst.so','libsatlas.so.3','libkaldi-base.so','libkaldi-hmm.so','libkaldi-ivector.so','libkaldi-feat.so','libkaldi-transform.so','libkaldi-gmm.so','libkaldi-tree.so','libkaldi-util.so','libkaldi-matrix.so'],
    library_dirs=['/usr/wxf/kaldi/tools/openfst/lib', '/usr/lib64/atlas', '/usr/wxf/kaldi/src/lib'],
    runtime_library_dirs=['/usr/wxf/kaldi/tools/openfst/lib', '/usr/lib64/atlas', '/usr/wxf/kaldi/src/lib'],

    extra_compile_args=['-std=c++11', '-DHAVE_ATLAS', '-O2', '-fPIC'],
    extra_link_args=['-std=c++11', '-Wall', '-msse', '-msse2', '-pthread', '-shared', '-DKALDI_DOUBLEPRECISION=0', '-DHAVE_EXECINFO_H=1', '-DHAVE_CXXABI_H', '-DHAVE_ATLAS', '-O2', '-fPIC'],                
    #define_macros=[('DKALDI_DOUBLEPRECISION', '0'),('DHAVE_EXECINFO_H', '1'),('HAVE_STRFTIME', None)],
)
 
setup (name = 'recognition',  
version = '0.1',  
author = "wu xian feng",  
description = """voice recognition""",  
ext_modules = [recognition_module],  
py_modules = ["recognition"],  
)


發佈了55 篇原創文章 · 獲贊 18 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章