使用Cython封装转换python代码为so包

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参数传参就行

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值