Python文件加密-Cython(Cythonize)

目录

前言

Cythonize使用

python文件准备

发布脚本准备

so文件编译

模块使用范例

扩展

如何在Spark集群上调用Cython编译的so文件

总结


前言

最近一直在研究针对python文件加密的技术,之前介绍的混合编程方法虽然也能做到加密的效果,但是需要同时写python与C/C++,对于不会C/C++的同学而言,就显得稍微麻烦了点。今天介绍一下通过Cython中的Cythonize编译python文件,生成so库文件给python进行调用的方法。


Cythonize使用

python文件准备

首先,需要准备一个python文件,其中可以编写类或者函数

def fib(n):
    """Print the Fibonacci series up to n."""
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a + b

发布脚本准备

然后为了生成一个Cython的扩展模块,还需要一个发布脚本

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("fib.py"),
)

so文件编译

最后我们可以执行下列命令,就可以在linux环境下生成对应的so文件

python setup.py build_ext --inplace

模块使用范例

完成了上述步骤后,我们就可以简单地使用这个模块了

>>> import fib
>>> fib.fib(2000)

可以看出该模块下有fib的属性方法,但是当我用ctypes模块调用的时候,却出现了错误

import ctypes
import os
# 切换到so文件所在目录
parent_path = os.getcwd()
for second_path in os.listdir(parent_path):
    file_path = os.path.join(parent_path, second_path)
    if "so" in file_path:
        mod = ctypes.cdll.LoadLibrary(file_path)
print(dir(mod))
print(mod.fib(2000))

报错信息如下:未申明fib函数

为了验证so文件能够被直接使用,将so文件直接拷贝到另外一台环境相近的机器上,可以直接使用。但是值得注意的是,这种方式编译生成的so文件只能在相同环境中使用,否则会报错。

比如我们不能够在python3.5的环境中使用python2.7打包的模块,二者有很大的区别。

 在python2.7中,可以使用的so文件格式如下:

[('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]

在python3.5中,可以使用的so文件格式如下:

[('.cpython-35m-x86_64-linux-gnu.so', 'rb', 3), ('.abi3.so', 'rb', 3), ('.so', 'rb', 3), ('.py', 'r', 1), ('.pyc', 'rb', 2)]

扩展

如何在Spark集群上调用Cython编译的so文件

当我们的使用场景是集群,我也采取了以下几种方式来尝试:

  1. 方式一:使用--files传输文件,再使用sys.path.append()添加路径
  2. 方式二:使用--files传输文件,使用imp或者importlib读取文件
  3. 方式三:直接将so文件打包成zip压缩包,对外提供一个接口,再通过--py-files选项上传到集群

经过尝试后发现其中方式一、二都可以正常运行,但是方式三会提示错误信息,为此我们得出以下结论:

  • 不能在外面直接引用data.zip里面的so文件
  • data.zip包里面的文件也不能引用包中的so文件
  • 外部的so文件能够引用zip压缩包中的python文件

因此,综合来看,so文件必须在外部放置才能够引用。

总结

今天主要介绍了借助cyhton中的Cythonize将python语言转化成C/C++语言,再编译成so文件,从而实现算法代码加密的目的。从中可以看出该方法简单方便,只需要有python语言基础即可,但是缺点也很明显,兼容性很差,编译好的so文件只能在相同环境中使用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python-Cython是一种使Python代码能够编译成C语言扩展的工具库。它包括Cython源码以及Python2.7/Lib/site-package下的cython.py文件Cython是基于Pyrex的,但是相比Pyrex,Cython拥有更多的功能和优化。Cython语言与Python语言非常相似,但是还支持调用C函数以及在变量和类属性上声明C类型,这使得Python代码能够以接近原生C语言的速度运行。使用Python-Cython,我们可以将Python代码转化为C语言扩展,从而提高代码的执行效率。使用Python-Cython时,可以在sys.path的头部添加cython_path,以防止Python site-package中的Cython对我们独立出来的Cython模块造成影响。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python---之cython](https://blog.csdn.net/zxyhhjs2017/article/details/80580585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [python-cython:https](https://download.csdn.net/download/weixin_42134144/16268191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值