windows平台 python生成 pyd文件
Python的文件类型介绍:
.py python的源代码文件
.pyc Python源代码import后,编译生成的字节码
.pyo Python源代码编译优化生成的字节码。pyo比pyc并没有优化多少,只是去掉了断言
.pyd Python的动态链接库(Windows平台)
.py, .pyc, .pyo 运行速度几乎无差别,只是pyc, pyo文件加载的速度更快,不能用文本编辑器查看内容,反编译不太容易
本文的目标是将test.py文件生成test.c文件,然后将test.c文件作为Python源码的一部分,重新编译生成Python,使用时直接import test即可使用test模块。
Cython基本介绍:
文档中这样总结Cython:
Cython is an optimising static compiler for both the Python programming language and the extended Cython programming language (based on Pyrex). It makes writing C extensions for Python as easy as Python itself.
是一个Python编程语言的编译器,写C扩展就像写Python代码一样容易。
其最重要的功能是:
- write Python code that calls back and forth from and to C or C++ code natively at any point.
即 将Python代码翻译为C代码。之后就可以像前面文章介绍的C语言扩展Python模块使用这些C代码了。
Cython基本用法:
在使用Cython编译Python代码时,务必要安装C/C++编译器,微软为Python提供了专用的编译器Microsoft Visual C++ Compiler for Python 2.7(包含32位和64位) 下载地址: http://aka.ms/vcpython27 百度云链接: https://pan.baidu.com/s/143jxjyQFtb_NCIWXt0DVWA 提取码: 5ick
1.下载完成并安装。以本机为例,安装完成后的路径为:
1
|
C:\Users\Administrator\AppData\Local\Programs\Common\Microsoft\Visual C + + for Python\ 9.0 |
2.修改python代码
修改python安装目录下Lib\distutils\msvc9compiler.py文件(如有必要可能msvccompiler.py文件也需要做相应更改,视系统而定),找到get_build_version方法直接return 9.0
然后再找到find_vcvarsall方法直接返回vcvarsall.bat的路径(以自己机器安装后的路径为准)
例如 return
r
'C:\Users\Administrator\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat'
2. 安装Cython库
pip install Cython
3. 编写一个测试代码文件test.py放在D:/test/test.py
def say_hello(): print "hello world"
然后在同一目录下,新建一个setup.py文件,内容如下:
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize("test.py"))
cythonize()是Cython提供将Python代码转换成C代码的API,
setup是Python提供的一种发布Python模块的方法。
4. 使用命令行编译Python代码:
3.上述完成之后就可以在windwos下正常编译python的C扩展。执行如下命令
1
|
python setup.py install |
当然也可以建立一个windows的二进制包:
1
|
python setup.py bdist_wininst |
当然也可以直接编译到当前目录:
1
|
python setup.py build_ext --inplace |
build_ext是指明python生成C/C++的扩展模块(build C/C++ extensions (compile/link to build directory))
--inplace指示 将编译后的扩展模块直接放在与test.py同级的目录中。
参考资料:
https://www.cnblogs.com/jianmu/p/7497274.html?utm_source=debugrun&utm_medium=referral
http://www.cnblogs.com/lazyboy/p/4017567.html