Python是一门解释型语言,当我们想让其他人运行我们的代码时,如果直接将.py源代码发送给他人,那么源代码将没有任何安全性可言,也就是任何一个人都可以打开源代码一看究竟,任何人都可以随意修改源代码。因此当我们想保护我们的源代码(算法保护)或者防止用户篡改源代码时,可以将Python源代码编译生成.pyd库文件或者.so库文件(Windows平台生成pyd文件,Linux生成so文件)。

事实上,只是我们表面上看Python是直接解释源代码,而实际上python解释器只会加载字节码。当我们import某个模块时,总是会在模块所在的目录创建一个__pycache__目录,里面存放着被加载模块的字节码文件。

Python有以下几种类型的文件:

  • py:Python控制台程序的源代码文件
  • pyw:Python带用户界面的源代码文件
  • pyx:Python包源文件
  • pyc:Python字节码文件(可通过逆向编译来得到源码)
  • pyo:Python优化后的字节码文件(可通过逆向编译来得到源码)
  • pyd:在Windows平台上Python的库文件(Python版DLL)
  • so:在Linux平台上是so文件

加密单个文件

编写setup.py文件

from setuptools import setup            # 可以使用setuptools中的setup
# from distutils.core import setup      # 也可以使用distutils.core中的setup
from Cython.Build import cythonize      setup(ext_modules = cythonize(["model_extract.py"]), script_args=['build_ext', '--inplace'])

命令行运行文件,会在文件目录下生成.so或.pyd加密文件

python setup.py build_ext --inplace

加密整个项目

实际上setup中可以配置很多参数,进而可以满足我们对整个项目轻松进行加密。

import shutil
import os
from setuptools import setup
# from distutils.core import setup
from distutils.extension import Extension
from distutils.command.clean import clean
from Cython.Distutils import build_extMODULE_NAME = "mytest"   # 给项目名字
SRC_DIR = "src"          # 要加密代码的目录,个人倾向于把源码统一放在src文件夹下
IGNORE_FILES = ["__init__.py"]    # 一般不对该文件加密# 对src文件夹下文件进行遍历,找到以py结尾的文件
def traverse_path(dir, files=None, folders=None, extension_list=('py',)):if folders is None:folders = []if files is None:files = []folders.append(dir)for file in os.listdir(dir):path = os.path.join(dir, file)if os.path.isfile(path):if '.' in path:_, extension = path.rsplit('.', 1)if extension.lower() in extension_list and file not in IGNORE_FILES:files.append(path)elif os.path.isdir(path):traverse_path(path, files, folders, extension_list)# ex_files参数可以支持不在src文件夹下的文件进行加密
def get_extensions(ex_files = []):   py_files = ex_filestraverse_path(SRC_DIR, files=py_files)   # traverse_path函数对py_files进行更新ext_names = map(lambda x: x.replace(os.path.sep, '.')[:-3], py_files)def make_extension(ext_name):ext_path = ext_name.replace('.', os.path.sep) + '.py'return Extension(ext_name, [ext_path], include_dirs=['.'])extensions = map(lambda x: make_extension(x), ext_names)return list(extensions)# ex_folders参数可以支持不在src文件夹下的文件进行加密
def get_packages(ex_folders = []): folders = ex_folderstraverse_path(SRC_DIR, folders=folders)     # traverse_path对folders进行更新packages = map(lambda x: x.replace('/', '.'), folders)return list(packages)# 对加密后的py,pyc和c文件进行清除
class CleanCode(object):    def clean_build(self, distribution):clean_command = clean(distribution)clean_command.all = Trueclean_command.finalize_options()clean_command.run()def delete_source_code(self, target_dir):source_file_list = []traverse_path(target_dir, files=source_file_list, extension_list=('py', 'pyc', 'c'))for source_file in source_file_list:if os.path.basename(source_file) not in IGNORE_FILES:os.remove(source_file)def copy_so(self, build_path, source_code_path):self._copy_so(build_path, build_path, source_code_path)def _copy_so(self, target_dir, build_base_dir, target_base_dir):for file in os.listdir(target_dir):path = os.path.join(target_dir, file)if os.path.isfile(path) and path.endswith('.so'):new_path = path.replace(build_base_dir, target_base_dir)shutil.copyfile(path, new_path)elif os.path.isdir(path):self._copy_so(path, build_base_dir, target_base_dir)# 继承Cython的build_ext类
class CustomBuildExt(build_ext, CleanCode): def run(self):build_ext.run(self)source_code_path = SRC_DIRbuild_path = os.path.join(self.build_lib, SRC_DIR)self.copy_so(build_path, source_code_path)self.clean_build(self.distribution)self.delete_source_code(source_code_path)ext_modules = get_extensions()setup(name=MODULE_NAME,packages=get_packages(),ext_modules=ext_modules,cmdclass={'build_ext': CustomBuildExt}   # 自定义的CustomBuildExt
)

项目中用因为用到了Extension类,可能需要在ext_modules那一行后面加上下面这个代码:

ext_modules = get_extensions()
for e in ext_modules:e.cython_directives = {'language_level': "3"}

具体参考example

利用Cython加密文件和项目相关推荐

  1. python代码加密cython_利用Cython加密python脚本

    由于 Python 的动态特性和开源特点,导致 Python 代码很难做到很好的加密.社区中的一些声音认为这样的限制是事实,应该通过法律手段而不是加密源码达到商业保护的目的:而还有一些声音则是不论如何 ...

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

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

  3. cython加密代码python_利用Cython对python代码进行加密

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

  4. ssh远程工具_Rsync如何利用SSH加密隧道同步文件

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 本文主要讲解Linux系统中的Rsync如何利用SSH ...

  5. linux配置文件密码加密工具,Linux下利用openssl对文件进行加密和解密

    转载地址:http://hi.baidu.com/edeed/item/99206a096b62d0e1ff240db8 --建立文件test.txt, 特意写入中英文# cd /tmp # echo ...

  6. 基于python的文件加密传输_python 利用Crypto进行AES解密加密文件

    背景:工作需要,部分数据进行了加密传输,对方使用了AES对密码进行了加密,需要获取到解密的数据. 目标:通过密钥成功解密文件. 关键词:AES_ECB,AES_CBC,Java和Python的AES加 ...

  7. python 利用Crypto进行AES解密加密文件

     前言:今天写一个程序的时候: 加密模式:AES/CBC/PKCS5Padding 加密初始化向量:长度为 16 的空字节数组 一直搞不懂长度为16的空字节数组怎么表示 然后我用ECB模式发现跟他给的 ...

  8. 肝!用 Python 加密文件

    生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而 ...

  9. 破解Zip加密文件常用的几种方法

    前言 在互联网的浪潮中,大家也许碰到过这种情况: 从网络上下载了一个zip文件,最后却发现它是用密码保护的,或者自己用密码加密了一个很重要zip文件,但是一段时间后忘记了密码,无法打开.这个时候,我们 ...

最新文章

  1. No Module Named '_pywrap_tensorflow_internal'
  2. 电脑打字手指正确姿势_洞箫的演奏姿势和动作
  3. redis和memcache的对比
  4. JAVA的节点流和处理流
  5. Eclipse用法和技巧十三:自动生成的TODO注释1
  6. 西瓜书读书笔记3-对数几率回归(logistic回归)公式推导
  7. 笔记本电脑VGA与DVI接口的区别(转)
  8. windows powershell 没有vi_「PowerShell」人人都值得学一点PowerShell实现自动化(2)
  9. live2d模型导入unity报错 live2dsdk与Cubism下载 live2dSDKforUnity使用手册
  10. cisco2811(Cisco2811 DHCP)
  11. 【系统集成项目管理工程师】—三点估算
  12. win10找回windows照片查看器的方法
  13. Go的全新漏洞检测工具govulncheck来了
  14. imitate wechat - 2
  15. 时区相关-这一篇全了解
  16. oracle共几条当前几条,Oracle 以某字段分组,以某字段排序,取前几条
  17. 用word制作正规公文(转)
  18. 好用的在线工具,提高你的办公工作效率
  19. 用JS输出菱形图案:
  20. MATLAB-矩阵的输入

热门文章

  1. Nwafu-OJ-1509 Problem 13和17的倍数和
  2. PaddleDetection进行路标检测
  3. MNIST数据集转为.jpg图片格式
  4. python随机图片api_【python】7个随机二次元图片api接口汇总(附网页调用示例)...
  5. EDEM入门学习教程—界面介绍
  6. 应用comsol分析多分支缝压裂应力分布
  7. android 人脸变形,人脸形变算法——液化变形
  8. window7 sp1安装python3.8.5
  9. Micro Python———MPU6050六轴传感器
  10. 信捷PLC与7台三菱变频器485通讯案例