使用cython的代码保护方案

简介: 建模开发平台即将推出了镜像构建的功能,以方便用户将开发好的代码迁移至其他环境执行。但在迁移过程中难免会有代码保护的需求,现提供一种基于cython的代码保护方案,能够在一定程度上解决代码保护的问题。

参考文档:

https://cython.org/

https://github.com/cython/cython

https://zhuanlan.zhihu.com/p/54296517


Cython介绍

Cython是一个类似于Python的编程语言,它是基于Python语言的扩展和优化。Cython语言是一种静态类型语言,同时也支持Python的动态类型特性,Cython代码会被转换成C语言代码,再编译成机器码,因此其执行速度比Python要快。

虽然Cython 的主要目的是带来性能的提升,但是基于它的原理:将 .py/.pyx 编译为 .c 文件,再将 .c 文件编译为 .so(Unix) 或 .pyd(Windows),其带来的另一个好处就是难以破解。但需要注意的是,cython本质上并非提供加密功能,而是通过编译成二进制文件后,提高他人阅读核心代码的难度,使用此方法加密代码还要注意代码安全。


方法

1)编写 setup.py:

可根据cython官方文档的指引,对您的代码进行编译。以下代码可供参考:

此脚本将会找到当前目录下所有含__init__.py文件的目录,并对他们进行编译,并在原地生成.so文件。

#encoding=utf-8fromsetuptoolsimportsetup, find_packagesfromsetuptools.extensionimportExtensionfromCython.BuildimportcythonizefromCython.Distutilsimportbuild_extfrompathlibimportPathimportshutilimportsys, os# some global variable, don't change them if you don't know what they meanmy_build_dir="build"classMyBuildExt(build_ext):
defrun(self):
build_ext.run(self)
build_dir=Path(self.build_lib)
root_dir=Path(__file__).parenttarget_dir=build_dirifnotself.inplaceelseroot_dirformoduleinmy_packages:
module=module.replace(".","/")
module_path=Path(module)
print(">>find modeule path:"+str(module_path))
self.copy_file(module_path/'__init__.py', root_dir, target_dir)
self.copy_file(module_path/'__main__.py', root_dir, target_dir)
forpinPath('.').iterdir():
ifp.is_file() andp.suffixnotin [".py", ".pyc"] andp.namenotinexclude_list:
self.copy_file(p, root_dir, target_dir)
print("copy end")
defcopy_file(self, path, source_dir, destination_dir):
ifnot (source_dir/path).exists():
returnshutil.copyfile(str(source_dir/path), str(destination_dir/path))
deffind_scrips():
scrips_list= []
forpinPath('.').iterdir():
ifp.is_file() and (p.namenotinexclude_list):
ifp.suffixin [".py"] and (notp.name.startswith(".")):
scrips_list.append(p.name)
print("find scrips:")
print(scrips_list)
print(exclude_list)
returnscrips_listif__name__=="__main__":
my_project_name="test"my_clang="gcc "ifos.path.isdir(my_build_dir):
print("Exist build dir, auto remove")
shutil.rmtree(my_build_dir)
print("===============start=================")
exclude_list= ["setup.py", ".DS_Store"]
os.environ["CC"]=my_clangmy_packages=find_packages()
print("packages:")
print(my_packages)
ext=[]
#找到所有的packageformoduleinmy_packages:
module=module.replace(".","/")
ext.append(Extension(module+".*", [module+"/*.py"]))
#找到根目录下的脚本ext.extend(find_scrips())
print("Extension:")
print(ext)
setup(
name=my_project_name,
ext_modules=cythonize(
ext,
build_dir=my_build_dir,
compiler_directives=dict(
always_allow_keywords=True            )),
cmdclass=dict(
build_ext=MyBuildExt        ),
packages=find_packages(where=".")
    )
print("===============end=================")

2)编译为 .c,再进一步编译为 .so 或 .pyd:

python setup.py build_ext --inplace

3)删除python源码,通过.so的方式进行执行:

find . -name'*py[c~]'-delete

4)编写启动脚本,执行过程中调用启动脚本:

from real_main import main
import sys
if __name__ =='__main__':
    main(sys.argv[1:])


注意事项

Cython 源代码的语法是 Python语法的一个超集,也就是说,任何可以在 Python 中使用的语法,也可以在 Cython 中使用。但是,以下几种 Python语法在 Cython 中是不支持的:

1.动态类型变量声明:在 Cython 中,变量必须是静态类型,需要在声明时指定数据类型。

2.不支持 eval() 函数和 exec语句:因为 Cython 是一种编译型语言,无法像 Python一样动态生成代码。

3.不支持生成器表达式和列表推导式:Cython 中不能直接使用生成器表达式和列表推导式,但是可以使用类似于 Python 中的 for 循环语句来达到相同的效果。

4.不支持一些 Python 内置函数:例如 zip(), filter(), map() 等,但是 Cython 提供了自己的实现,用于替代这些函数。

5.不支持 slots 特殊变量:Cython 中不支持 slots 特殊变量来限制类的属性,但是可以使用 cdef class 来实现类的属性限制。

6.不支持一些 Python 模块和库:例如 asyncio, logging 等,因为这些模块和库在 Cython 中不可用。

7.不支持 Python 的全局解释器锁(GIL):Cython 中没有 GIL,因此可以使用 Python 的多线程模块来实现并发编程。

相关文章
|
7月前
|
机器学习/深度学习 人工智能 数据挖掘
Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。
Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。
|
5月前
|
编译器 Linux C语言
编译并运行 Cython 代码的几种方式
编译并运行 Cython 代码的几种方式
155 1
|
8月前
|
Unix Shell 数据处理
怎样使用Cython提升Python的性能
**Cython是Python的性能增强工具,用于提升Python代码的速度。它允许声明变量类型并调用C库。安装Cython使用`pip install Cython`。Cython语法接近Python,但通过类型声明优化性能。编译Cython代码需创建setup.py文件,然后运行`python setup.py build_ext --inplace`。通过Cython,可以直接优化Python代码和调用C函数,平衡速度与灵活性。**
206 2
|
9月前
|
Python
Python中的装饰器:提升代码效率与可维护性
装饰器是Python中一种强大的编程工具,它可以通过在函数定义前使用@符号来简单地扩展和修改函数的行为。本文将介绍Python中装饰器的基本概念、用法以及实际应用场景,帮助读者更好地理解并运用这一特性来提升代码效率与可维护性。
|
9月前
|
开发者 Python
提升代码效率的利器:Python装饰器详解
本文深入探讨Python中的装饰器(decorators)机制,介绍其原理、用法和实际应用场景。通过学习装饰器的高级特性,开发者可以有效提升代码的可读性、简洁性和灵活性,从而更高效地编写Python程序。
|
4月前
|
设计模式 数据安全/隐私保护 开发者
探索Python中的装饰器:提升代码效率与可读性
【10月更文挑战第3天】 本文将深入探讨Python中装饰器的使用方法及其背后的原理。通过实例展示如何利用装饰器简化代码、提高可读性,并介绍一些高级用法。无论您是编程新手还是经验丰富的开发者,都能从中获益。
|
9月前
|
缓存 测试技术 开发者
深入理解Python装饰器:提升代码效率与可读性
本文旨在深入探讨Python装饰器的工作原理、使用场景及其在实际开发中如何有效提高代码的效率和可读性。通过对装饰器概念的阐述、基础用法的介绍,以及高级应用示例的展示,读者将获得关于如何在Python项目中灵活运用装饰器以优化代码结构和性能的深刻理解。不同于传统的摘要,本文通过案例驱动的方式,让读者在具体的应用场景中感受装饰器的强大功能,旨在为Python开发者提供一个全面、实用的装饰器应用指南。
78 4
|
3月前
|
Python
探索Python中的装饰器:简化代码,提升效率
【10月更文挑战第39天】在编程的世界中,我们总是在寻找使代码更简洁、更高效的方法。Python的装饰器提供了一种强大的工具,能够让我们做到这一点。本文将深入探讨装饰器的基本概念,展示如何通过它们来增强函数的功能,同时保持代码的整洁性。我们将从基础开始,逐步深入到装饰器的高级用法,让你了解如何利用这一特性来优化你的Python代码。准备好让你的代码变得更加优雅和强大了吗?让我们开始吧!
39 1
|
6月前
|
Python
探索Python装饰器:简化代码,提升效率
【8月更文挑战第31天】装饰器在Python中是一种强大的工具,它允许我们在不修改函数代码的情况下增加额外的功能。本文将通过实际例子和简单易懂的语言,带你了解什么是装饰器、如何创建和使用它们,以及装饰器如何帮助我们编写更加简洁高效的代码。我们将从基础开始,逐步深入到装饰器的高级应用,让你轻松掌握这一实用的编程技巧。
|
9月前
|
设计模式 缓存 数据安全/隐私保护
使用装饰器优化 Python 代码的技巧与实践
使用装饰器优化 Python 代码的技巧与实践
110 0

热门文章

最新文章