思路:

先将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相关推荐

  1. python 源码保护_Python代码保护

    Python等解释性脚本语言都需要源码明文存储,所以有两种情况需要考虑代码保护的问题: 代码逻辑的保护:代码本身有版权或者不能公开源代码 涉及用户名.密码等关键信息的配置 代码保护方法 Python代 ...

  2. essential c++源码_Goldenmask - 一键化保护你的 Python 源码

    项目地址: https://github.com/youngquan/goldenmask​github.com Goldenmask 直译为金色的罩子,灵感来自"金钟罩"的&qu ...

  3. 【Python基础】加密你的Python源码顺便再打个包如何?

    本篇为专属于"交通科研Lab"志愿者系列推文活动,为大家带来交通高校硕博们原创推文.为作者点赞,欢迎大家关注交流!!! 点击蓝字 关注我们 成为一个智慧.快乐和富有的人. --王宇 ...

  4. python源码只有编译成二进制_setup-cython(2):把Python打包成二进制应用吧

    代码近过Cython化之后,安全性得到了提高,那么紧接着自然就会有一个不得不面对的事情,如何把我们写好的应用发布给别人呢? Java可以直接打包成Jar.微软系的天生就能打包成exe,而Go则非常的舒 ...

  5. python源码加密实现

    本文参考如何保护你的 Python 代码对其想法进行实现. 源码地址:spython@github RAYENCRY rayencry使用AES算法对指定目录中的Python源码加密. 内容 背景 安 ...

  6. python编译器源码_编译python源码

    广告关闭 回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你! 尝试通过源码自己编译 python,使用的系统是 ubuntu14.04 l ...

  7. Python源码学习:多线程实现机制

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文分析Python中的多线程机制,主要通过一个多线程的脚本来分析多线程的基本操作与 ...

  8. Python源码学习:Python类机制分析-用户自定义类

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一文,分析了Python在启动初始化时,对内置类的一个基本的初始化流程,本文就简析 ...

  9. Python源码学习:Python类机制分析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文主要分析Python中类时如何实现的,在Python中,一切都是对象:任何对象都 ...

  10. Python源码学习:Python函数浅析-函数闭包

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇分析了函数参数的分析后,本文分析函数闭包的实现.函数闭包即函数定义和函数表达式 ...

最新文章

  1. oracle数据库性能awr,常见问题:如何使用AWR报告来诊断数据库性能问题
  2. tableau可视化函数使用案例(四十六)-数字函数的使用方法
  3. hexo+git维护笔记
  4. 基于xilinx vivado的XADC IP设置使用详解
  5. Mysql字符串截取 mysql将字符串字段转为数字排序或比大小
  6. 如何判断模糊图像_深圳企业宣传片拍摄制作教你如何使用手动聚焦
  7. linux 合并csv文件 cat,Python:将两个CSV文件合并为多级JSON
  8. unity2019汉化
  9. STM32F103ZET6【标准库函数开发】-----TM1638模块驱动4位8段共阴极数码管
  10. python二级题库(百分之九十原题) 刷题软件推荐
  11. 使用Python及SMTP协议发送邮件(以163邮箱为例)
  12. win10系统 开启蓝牙服务器,Win10打开蓝牙的方法步骤详解
  13. 高度坍塌的产生条件和解决方法
  14. SIFT之极值点检测
  15. linux awk 区别,linux awk 中 RS,ORS,FS,OFS 区别与联系
  16. 两个自变量和一个因变量spss_多个自变量对一个因变量的影响(SPSS:协方差分析)...
  17. DeepLearing—CV系列(二十二)——DCGAN生成动漫卡通人脸的Pytorch实现
  18. 2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给
  19. python读取txt数据处理后.csv格式输出
  20. 笔试面试经历----上海爱立信

热门文章

  1. 华为 HR 内网 5000 字实名控诉:研发兄弟一个月加班 160 小时却被说不努力...
  2. 2017下半年,一二线互联网公司Android面试题汇总
  3. Android Multimedia框架总结(十)Stagefright框架之音视频输出过程
  4. Android View框架总结(四)View布局流程之Measure
  5. 计算机文化基础清华大学出版社,清华大学出版社-图书详情-《计算机基础》
  6. python pickle反序列化漏洞_渗透测试 - 黑客技术 | 【技术分享】记CTF比赛中发现的Python反序列化漏洞_吾爱漏洞...
  7. vue 循环 递归组件_【求助】vue组件递归调用异常问题
  8. linux安装中文输入法sc,Ubuntu 设置中文输入法
  9. ie对象不支持“jggrid“属性或方法_8.2 location 对象
  10. 1-csv文件,解决数字不全或者数组+e的显示的问题