注:.pyc也有一定的保护性,容易被反编译出源码...

项目发布时,为防止源码泄露,需要对源码进行一定的保护机制,本文使用Cython将.py文件转为.so进行保护。这一方法,虽仍能被反编译,但难度会比较大。另外,Cython是Python的超集。

自行安装Cython

1,创建complie.py文件

  1. from Cython.Build import cythonize
    from Cython.Distutils import build_ext
    from setuptools import setup
    from setuptools.extension import Extension
  2.  
  3. setup(
    ext_modules=cythonize(
    [
    Extension('project.*', ['project/*.py']),
    Extension('project.api.*', ['project/api/*.py']),
    Extension('project.api.bizs.*', ['project/api/bizs/*.py']),
    Extension('project.api.data.export*', ['project/api/data/export/*.py']),
    Extension('project.api.exceptions.*', ['project/api/exceptions/*.py']),
    # 需要保护的.py文件目录写在此处
    ],
    build_dir='build',
    compiler_directives=dict(
    always_allow_keywords=True, language_level=3
    )
    ),
    cmdclass=dict(
    build_ext=build_ext
    )
    )

language_level代表python版本,python2就写2

2,运行命令:python compile.py build_ext --inplace

将会在各目录生成每个.py文件的.so文件,和一个build文件夹。.py文件已经被保护了,.so文件之间可以相互调用。

部署时删除项目中.py文件、build文件夹。

如果项目中使用了celery,注意不要编译celery代码,否则celery将无法使用。

贴一个shell脚本,配合上段代码使用。

  1. #!/bin/bash
  2.  
  3. # 清除缓存目录
  4. find . -type d -name __pycache__ | xargs rm -rf
  5.  
  6. # 编译代码
  7. python3 -m venv env
  8. sh env/bin/activate
  9. python3 compile.py build_ext --inplace
  10. if [ $? -ne ]; then
  11. exit
  12. fi
  13.  
  14. # 更改celery文件
  15. mv ./project/api/tasks/cele/__init__.py ./project/api/tasks/cele/__init__.py.bak
  16. mv ./project/api/tasks/cele/base.py ./project/api/tasks/cele/base.py.bak
  17. mv ./project/api/tasks/cele/export.py ./project/api/tasks/cele/export.py.bak
  18. mv ./project/api/tasks/__init__.py ./project/api/tasks/__init__.py.bak
  19. mv ./project/api/tasks/dispatch_subdomain.py ./project/api/tasks/dispatch_subdomain.py.bak
  20. mv ./project/api/tasks/recognize_area.py ./project/api/tasks/recognize_area.py.bak
  21.  
  22. # 将.so文件改名
  23. find ./project -name '*.so' | awk -F '.cpython-36m-x86_64-linux-gnu' '{print "mv "$0" "$1$2}' | sh
  24.  
  25. # 删除.py文件
  26. find ./project -name '*.py' | xargs rm -f
  27.  
  28. mv ./project/api/tasks/cele/__init__.py.bak ./project/api/tasks/cele/__init__.py
  29. mv ./project/api/tasks/cele/base.py.bak ./project/api/tasks/cele/base.py
  30. mv ./project/api/tasks/cele/export.py.bak ./project/api/tasks/cele/export.py
  31. mv ./project/api/tasks/__init__.py.bak ./project/api/tasks/__init__.py
  32. mv ./project/api/tasks/dispatch_subdomain.py.bak ./project/api/tasks/dispatch_subdomain.py
  33. mv ./project/api/tasks/recognize_area.py.bak ./project/api/tasks/recognize_area.py
  34.  
  35. # 清除不需要的文件
  36. rm -rf build
  37. rm -f .gitignore
  38. rm -f compile.py
  39. rm -f build.sh

END!

Cython保护Python代码的更多相关文章

  1. 利用Cython对python代码进行加密

    利用Cython对python代码进行加密 Cython是属于PYTHON的超集,他首先会将PYTHON代码转化成C语言代码,然后通过c编译器生成可执行文件.优势:资源丰富,适合快速开发.翻译成C后速 ...

  2. [转]使用Cython来保护Python代码库

    转自:http://blog.csdn.net/chenyulancn/article/details/77168621 最近,我在做一个需要使用Cython来保护整个代码库的Python项目. 起初 ...

  3. 用Cython加速Python代码

    安装Cython pip install Cython 如何使用 要在我们的笔记本中使用Cython,我们将使用IPython magic命令.Magic命令以百分号开始,并提供一些额外的功能,这些功 ...

  4. 如何保护你的 Python 代码 (一)—— 现有加密方案

    https://zhuanlan.zhihu.com/p/54296517 0 前言 去年11月在PyCon China 2018 杭州站分享了 Python 源码加密,讲述了如何通过修改 Pytho ...

  5. [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案

    如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前

  6. 使用cython库对python代码进行动态编译达到加速效果及python第三方包的制作安装

    1.测试代码:新建  fib.pyx # coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.cl ...

  7. 类似py2exe软件真的能保护python源码吗

    类似py2exe软件真的能保护python源码吗 背景 最近写了个工具用于对项目中C/C++文件的字符串常量进行自动化加密处理,用python写的,工具效果不错,所以打算在公司内部推广.为了防止代码泄 ...

  8. PEP 8 - Python代码样式指南

    PEP 8 - Python代码样式指南 PEP: 8 标题: Python代码风格指南 作者: Guido van Rossum <python.org上的guido>,Barry Wa ...

  9. 【转】类似py2exe软件真的能保护python源码吗

    类似py2exe软件真的能保护python源码吗 背景 最近写了个工具用于对项目中C/C++文件的字符串常量进行自动化加密处理,用python写的,工具效果不错,所以打算在公司内部推广.为了防止代码泄 ...

随机推荐

  1. spring源码学习之bean的加载(三)

    接着二中的继续写,那个都超过1000行了,哈,需要重新写一个,要不太长了,我都看不下去了 7.4 初始化bean doCreateBean函数中有这样一行代码:这行代码中initializeBean函 ...

  2. 洛谷P5071 此时此刻的光辉

    2s512M. 解:先分解质因数.考虑按照质因数大小是否大于√分类. 大于的就是一个数颜色个数,莫队即可n√m. 小于的直接枚举质因数做前缀和然后O(1)查询.总时间复杂度n(√m + σ(√V)). ...

  3. agc003E Sequential operations on Sequence

    题意: 有一个数字串S,初始长度为n,是1 2 3 4 …… n. 有m次操作,每次操作给你一个正整数a[i],你先把S无穷重复,然后把前a[i]截取出来成为新的S. 求m次操作后,每个数字在S中出现 ...

  4. leetcode 665

    665. Non-decreasing Array Input: [4,2,3] Output: True Explanation: You could modify the first 4 to 1 ...

  5. Spring MVC中获取当前项目的路径

    Spring MVC中获取当前项目的路径 在web.xml中加入以下内容 <!--获取项目路径--> <context-param> <param-name>web ...

  6. [转]JS设计模式-单例模式(二)

    单例模式是指保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等.在javaScript开发中 ...

  7. 珂朵莉树(ODT)笔记

    珂朵莉树,又叫老司机树($Old\, Driver \, Tree$) 是一种暴力出奇迹,就怕数据不随机的数据结构. 适用 需要用线段树维护一些区间修改的信息…… 像是区间赋值(主要),区间加…… 原 ...

  8. Docker搭建ELK的javaweb应用日志收集存储分析系统

    1.启动elasticsearch docker run -d --name myes -p 9200:9200 elasticsearch:2.3 2.启动kibana docker run --n ...

  9. 洛谷P1147 连续自然数和 [2017年6月计划 数论01]

    P1147 连续自然数和 题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以 ...

  10. WPF MVVM简单介绍

     前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...