python源码保护之cython
思路:
先将py代码转成c代码,然后编译成pyd(window上是pyd,linux上是so)文件
linux上是so
ubuntu 16.04下:
1. 安装 Cython
pip install cython
2. 添加 hello.pyx
假设在hello.pyx文件中的一个简单的“hello world”脚本:
def say_hello_to(name):print("Hello %s!" % name)
注意文件后缀是pyx
3. 添加相应的setup.py脚本
from distutils.core import setup
from Cython.Build import cythonizesetup(name='Hello world app',ext_modules=cythonize("hello.pyx"))
4. 编译
根据您使用的Python版本,运行:
python setup.py build_ext --inplace
成功构建后,您可以删除.c和.py文件,并仅保留.so文件
5.测试
#!/usr/bin/env python
from hello import say_hello_tosay_hello_to('mstools')
参考:https://blog.51cto.com/mstools/2357709
window上是pyd
环境部署:http://yshblog.com/blog/117
整体项目打包脚本:
- https://github.com/himoutoumaru/setup-cython
- https://blog.csdn.net/qq_20154743/article/details/77891572
- https://github.com/ArvinMei/py2so/blob/master/py2so.py
- 或者
#-* -coding: UTF-8 -* -
__author__ = 'Arvin'"""
执行前提:系统安装python-devel 和 gccPython安装cython
编译某个文件夹:python py2so.py BigoModel
生成结果:目录 build 下
生成完成后:启动文件还需要py/pyc担当,须将启动的py/pyc拷贝到编译目录并删除so文件
"""import sys, os, shutil, time
from distutils.core import setup
from Cython.Build import cythonizestarttime = time.time()
setupfile= os.path.join(os.path.abspath('.'), __file__)def getpy(basepath=os.path.abspath('.'), parentpath='', name='', build_dir="build", excepts=(), copyOther=False, delC=False):"""获取py文件的路径:param basepath: 根路径:param parentpath: 父路径:param name: 文件/夹:param excepts: 排除文件:param copy: 是否copy其他文件:return: py文件的迭代器"""fullpath = os.path.join(basepath, parentpath, name)for fname in os.listdir(fullpath):ffile = os.path.join(fullpath, fname)if os.path.isdir(ffile) and ffile != os.path.join(basepath, build_dir) and not fname.startswith('.'):for f in getpy(basepath, os.path.join(parentpath, name), fname, build_dir, excepts, copyOther, delC):yield felif os.path.isfile(ffile):# print("\t", basepath, parentpath, name, ffile)ext = os.path.splitext(fname)[1]if ext == ".c":if delC and os.stat(ffile).st_mtime > starttime:os.remove(ffile)elif ffile not in excepts and ext not in('.pyc', '.pyx'):# print("\t\t", basepath, parentpath, name, ffile)if ext in('.py', '.pyx') and not fname.startswith('__'):yield os.path.join(parentpath, name, fname)elif copyOther:dstdir = os.path.join(basepath, build_dir, parentpath, name)if not os.path.isdir(dstdir): os.makedirs(dstdir)shutil.copyfile(ffile, os.path.join(dstdir, fname))else:passif __name__ == "__main__":currdir = os.path.abspath('.')parentpath = sys.argv[1] if len(sys.argv)>1 else "."currdir, parentpath = os.path.split(currdir if parentpath == "." else os.path.abspath(parentpath))build_dir = os.path.join(parentpath, "build")build_tmp_dir = os.path.join(build_dir, "temp")print("start:", currdir, parentpath, build_dir)os.chdir(currdir)try:#获取py列表module_list = list(getpy(basepath=currdir,parentpath=parentpath, build_dir=build_dir, excepts=(setupfile)))print(module_list)setup(ext_modules = cythonize(module_list),script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir])module_list = list(getpy(basepath=currdir, parentpath=parentpath, build_dir=build_dir, excepts=(setupfile), copyOther=True))except Exception as ex:print("error! ", ex)finally:print("cleaning...")module_list = list(getpy(basepath=currdir, parentpath=parentpath, build_dir=build_dir, excepts=(setupfile), delC=True))if os.path.exists(build_tmp_dir): shutil.rmtree(build_tmp_dir)print("complate! time:", time.time()-starttime, 's')
在要打包的目录的同级目录下,创建setup.py,将上述代码复制到setup.py, 直接运行setup.py即可。
执行成功后,会出现一个build文件夹,其中包含有和要打包的项目结构一样的项目,和原项目不同的是,其中的py文件(除__init__外)均被打包成pyd文件,如此源码就被保护起来了。
python源码保护之cython相关推荐
- python 源码保护_Python代码保护
Python等解释性脚本语言都需要源码明文存储,所以有两种情况需要考虑代码保护的问题: 代码逻辑的保护:代码本身有版权或者不能公开源代码 涉及用户名.密码等关键信息的配置 代码保护方法 Python代 ...
- essential c++源码_Goldenmask - 一键化保护你的 Python 源码
项目地址: https://github.com/youngquan/goldenmaskgithub.com Goldenmask 直译为金色的罩子,灵感来自"金钟罩"的&qu ...
- 【Python基础】加密你的Python源码顺便再打个包如何?
本篇为专属于"交通科研Lab"志愿者系列推文活动,为大家带来交通高校硕博们原创推文.为作者点赞,欢迎大家关注交流!!! 点击蓝字 关注我们 成为一个智慧.快乐和富有的人. --王宇 ...
- python源码只有编译成二进制_setup-cython(2):把Python打包成二进制应用吧
代码近过Cython化之后,安全性得到了提高,那么紧接着自然就会有一个不得不面对的事情,如何把我们写好的应用发布给别人呢? Java可以直接打包成Jar.微软系的天生就能打包成exe,而Go则非常的舒 ...
- python源码加密实现
本文参考如何保护你的 Python 代码对其想法进行实现. 源码地址:spython@github RAYENCRY rayencry使用AES算法对指定目录中的Python源码加密. 内容 背景 安 ...
- python编译器源码_编译python源码
广告关闭 回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你! 尝试通过源码自己编译 python,使用的系统是 ubuntu14.04 l ...
- Python源码学习:多线程实现机制
Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文分析Python中的多线程机制,主要通过一个多线程的脚本来分析多线程的基本操作与 ...
- Python源码学习:Python类机制分析-用户自定义类
Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一文,分析了Python在启动初始化时,对内置类的一个基本的初始化流程,本文就简析 ...
- Python源码学习:Python类机制分析
Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文主要分析Python中类时如何实现的,在Python中,一切都是对象:任何对象都 ...
- Python源码学习:Python函数浅析-函数闭包
Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇分析了函数参数的分析后,本文分析函数闭包的实现.函数闭包即函数定义和函数表达式 ...
最新文章
- oracle数据库性能awr,常见问题:如何使用AWR报告来诊断数据库性能问题
- tableau可视化函数使用案例(四十六)-数字函数的使用方法
- hexo+git维护笔记
- 基于xilinx vivado的XADC IP设置使用详解
- Mysql字符串截取 mysql将字符串字段转为数字排序或比大小
- 如何判断模糊图像_深圳企业宣传片拍摄制作教你如何使用手动聚焦
- linux 合并csv文件 cat,Python:将两个CSV文件合并为多级JSON
- unity2019汉化
- STM32F103ZET6【标准库函数开发】-----TM1638模块驱动4位8段共阴极数码管
- python二级题库(百分之九十原题) 刷题软件推荐
- 使用Python及SMTP协议发送邮件(以163邮箱为例)
- win10系统 开启蓝牙服务器,Win10打开蓝牙的方法步骤详解
- 高度坍塌的产生条件和解决方法
- SIFT之极值点检测
- linux awk 区别,linux awk 中 RS,ORS,FS,OFS 区别与联系
- 两个自变量和一个因变量spss_多个自变量对一个因变量的影响(SPSS:协方差分析)...
- DeepLearing—CV系列(二十二)——DCGAN生成动漫卡通人脸的Pytorch实现
- 2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给
- python读取txt数据处理后.csv格式输出
- 笔试面试经历----上海爱立信
热门文章
- 华为 HR 内网 5000 字实名控诉:研发兄弟一个月加班 160 小时却被说不努力...
- 2017下半年,一二线互联网公司Android面试题汇总
- Android Multimedia框架总结(十)Stagefright框架之音视频输出过程
- Android View框架总结(四)View布局流程之Measure
- 计算机文化基础清华大学出版社,清华大学出版社-图书详情-《计算机基础》
- python pickle反序列化漏洞_渗透测试 - 黑客技术 | 【技术分享】记CTF比赛中发现的Python反序列化漏洞_吾爱漏洞...
- vue 循环 递归组件_【求助】vue组件递归调用异常问题
- linux安装中文输入法sc,Ubuntu 设置中文输入法
- ie对象不支持“jggrid“属性或方法_8.2 location 对象
- 1-csv文件,解决数字不全或者数组+e的显示的问题