fo使用Cython将python文件封装打包为so包,主要有几点好处:
1.代码保护,打成so包防止别人直接看代码
2.具有一定的加速功能,比如python的循环之类的变为C的会快很多。
3.简单容易实现,不用像Ctypes那样调用时候要考虑到参数类型的转换。
linux环境下,需要基于gcc的环境编译setup.py
from distutils.core import setup, Extension
import os
from Cython.Build import cythonize
def cython_build(origin_file):
root = os.path.dirname(origin_file)
fname = origin_file.split("/")[-1].split(".")[0]
setup(ext_modules = cythonize(Extension(
fname, #最终生成的文件名
sources=[origin_file], #待编译的文件
language='c',
include_dirs=[],
library_dirs=[],
libraries=[],
extra_compile_args=[],
extra_link_args=[]
)))
# os.system("mv ./{}.*.so {}/".format(fname,root))
def pyfile2so(origin_file):
root = os.path.dirname(origin_file)
fname = origin_file.split("/")[-1].split(".")[0]
with open(origin_file,'r')as f:
content = f.read()
newfile = os.path.join(root,"{}.pyx".format(fname))
with open(newfile,'w')as f:
f.write("#cython:language_level=3\n")
f.write(content)
cython_build(newfile)
pyfile2so("/workspace/project/testCython.py")
编译脚本是不能直接的
python setyp.py
会报错 no commands supplied
需要加这些参数,在同级目录生成so文件,在同级目录下的build文件夹里面生成.o文件
python setup.py build_ext --inplace
使用的时候就像普通的py文件一样直接import就可以,可以直接调用so里面的函数,且没有参数类型转换,直接python参数传参就行