使用 distutils 编译,建立一个 setup.py 的脚本
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
name = 'cython_build_test’,
cmdclass = {'build_ext':build_ext},
ext_modules = ext_modules
)
关于setup函数的一些參数:
1、name
site-package安装文件夹下的egg文件:/usr/lib64/python2.6/site-packages/cython_build_test-0.0.0-py2.6.egg-info。假设不指定,将会与UNKNOW命名:/usr/lib64/python2.6/site-packages/UNKNOWN-0.0.0-py2.6.egg-info
2、packages告诉Distutils须要处理那些包(包括__init__.py的目录)
3、package_dirs告诉Distutils哪些文件夹下的文件被映射到哪个源代码包。一个样例:package_dir = {‘’:lib}。表示“root package”中的模块都在lib文件夹4、ext_modules是一个包括Extension实例的列表,Extension的定义也有一些參数,定义例如以下
5、ext_package定义extension的相对路径
6、requires定义依赖哪些模块
7、provides定义能够为哪些模块提供依赖
8、scripts指定python源代码文件,能够从命令行运行。在安装时指定—install-script
9、package_data通常包括与包实现相关的一些数据文件或类似于readme的文件。假设没有提供模板。会被加入到MANIFEST文件里。
10、data_files指定其它的一些文件(如配置文件)
关于ext_modules參数具体说明:
定义Extension实例列表,
1、name
扩展包的名字,供python导入import时使用
2、source
源文件组成的列表,源文件能够是C,C++等特定的资源文件,或不论什么其它由build_ext命令确觉得来源为Python扩展。
3、language
扩展语言名称
4、include_dirs
提供搜索C/C++头文件的文件夹组成的列表(比方:*.h)
5、library_dirs
提供搜索C/C++库文件的文件夹组成的列表(比方:*.a)
6、libraries
库名(不是文件名称或路径)的组成的列表
简单的setup.py文件:
(1)
执行setup.py,传递參数build_ext。选项—inplace
python setup.py build_ext —inplace系统报告:
running build_ext
cythoning import_cython_c_math.pyx to import_cython_c_math.c
building 'import_cython_c_math' extension
creating build
creating build/temp.linux-x86_64-2.6
gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/python2.6 -c import_cython_c_math.c -o build/temp.linux-x86_64-2.6/import_cython_c_math.o
gcc -pthread -shared build/temp.linux-x86_64-2.6/import_cython_c_math.o -L/usr/lib64 -lpython2.6 -o /home/linshaowei/cython_setup_test/import_cython_c_math.so
此时:
当前文件夹下自己主动创建了:
build文件夹
进入到build文件夹里。有一个文件夹: temp.linux-x86_64-2.6。该文件夹里面存放了 import_cython_c_math.o文件。该文件是c代码编译之后的包括0。1指令的对象文件(即c语音编译之后的文件)
import_cython_c_math.so,其次是生成供python直接引用的动态链接库,是一个链接文件
此时就能够在python引用该库文件了。
(2)
执行setup.py,传递參数build(编译)
python setup.py build
系统报告:
running build
running build_ext
cythoning import_cython_c_math.pyx to import_cython_c_math.c
building 'import_cython_c_math' extension
creating build
creating build/temp.linux-x86_64-2.6
gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/python2.6 -c import_cython_c_math.c -o build/temp.linux-x86_64-2.6/import_cython_c_math.o
creating build/lib.linux-x86_64-2.6
gcc -pthread -shared build/temp.linux-x86_64-2.6/import_cython_c_math.o -L/usr/lib64 -lpython2.6 -o build/lib.linux-x86_64-2.6/import_cython_c_math.so
此时,
当前文件夹下自己主动创建了:
build文件夹
进入到build文件夹,有两个文件夹:
lib.linux-x86_64-2.6该文件夹里面存放: import_cython_c_math.so 文件
temp.linux-x86_64-2.6该文件夹里面存放:import_cython_c_math.o文件
sudo python setup.py install(安装)
running install
running build
running build_ext
skipping 'import_cython_c_math.c' Cython extension (up-to-date)
running install_lib
copying build/lib.linux-x86_64-2.6/import_cython_c_math.so -> /usr/lib64/python2.6/site-packages
running install_egg_info
Writing /usr/lib64/python2.6/site-packages/cython_build_test-0.0.0-py2.6.egg-info
install參数,将动态链接文件 build/lib.linux-x86_64-2.6/import_cython_c_math.so创建了软链接/usr/lib64/python2.6/site-packages
再写入Writing /usr/lib64/python2.6/site-packages/cython_build_test-0.0.0-py2.6.egg-info python安装文件夹,生成了egg文件并存放到安装文件夹。就意味着python能够随处引用它