写点什么

python 通过将 py 文件转为 so 实现代码加密

作者:关耳
  • 2023-08-20
    湖北
  • 本文字数:1219 字

    阅读完需:约 4 分钟

python通过将py文件转为so实现代码加密

这里介绍一种通过将 .py 代码转为.so 文件来做到某种意义上的加密的方法


前提提醒: 不同的操作系统环境中转 so 后只能在其相同的环境内执行,无法实现跨平台可用

单个文件转so:guaner.py文件转为so

guaner.py的同级目录下新建一个setup.py(名称可以自己定义,不一定要用 setup.py 命名)文件,文件的内容如下:


from distutils.core import setupfrom Cython.Build import cythonizesetup(ext_modules = cythonize(["guaner.py"]))
复制代码


然后执行以下命令进行转 so


python setup.py build_ext
复制代码


示例:创建完成后目录结构如下


.├── __init__.py├── guaner.py└── setup.py0 directories, 3 files
复制代码


然后执行命令开始转 so


.├── __init__.py├── build│   ├── lib.macosx-10.9-x86_64-3.10│   │   └── test│   │       └── jiami│   │           └── guaner.cpython-310-darwin.so│   └── temp.macosx-10.9-x86_64-3.10│       └── guaner.o├── guaner.c├── guaner.py└── setup.py
复制代码


生成的so文件在build目录下,找到guaner.cpython-310-darwin.so就是转so后的文件了


重点提醒: __init__.py文件对转so的影响

注意看到,为什么多了一个 jiami 目录?

首先看下我完整的文件目录结构:


test├── __init__.py├── jiami│   ├── guaner.py│   └── setup.py
复制代码


这是我完整的目录结构,里面有个很关键的文件,test目录下有__init__.pyjiami目录下也有__init__.py,在转so文件的时候,因为python代码结构中,如果目录中存在__init__.py,会把当前这个目录当作一个包,模块,可以被其他目录下代码引用,所以转so的时候,会顺着__init__.py所在的包结构,一层层的往上找,直到最后非python模块的目录为止


因此打包完成后的目录结构就是这样的结构了:


.├── __init__.py├── build│   ├── lib.macosx-10.9-x86_64-3.10│   │   └── test│   │       └── jiami│   │           └── guaner.cpython-310-darwin.so│   └── temp.macosx-10.9-x86_64-3.10│       └── guaner.o├── guaner.c├── guaner.py└── setup.py
复制代码

现在去掉__init__.py再打包看看结果

jiami├── guaner.py└── setup.py
复制代码


执行python setup.py build_ext得到 so 文件目录如下


jiami├── build│   ├── lib.macosx-10.9-x86_64-3.10│   │   └── guaner.cpython-310-darwin.so│   └── temp.macosx-10.9-x86_64-3.10│       └── guaner.o├── guaner.c├── guaner.py└── setup.py
复制代码


这样看,代码是不是就很符合自己的期望了,这样把文件so文件分发到相同操作系统环境后,就可以放心执行不用担心别人可以查看我们的源代码了


现在我们可以做到单个文件转位so了,那么我们是不是可以把当前的python项目整体的所有代码全部转位so文件了,这样发布给用户的时候,也不用担心看到我们的源代码了,下一章开始介绍打包整个python项目

发布于: 2023-08-20阅读数: 3
用户头像

关耳

关注

还未添加个人签名 2019-06-18 加入

还未添加个人简介

评论

发布
暂无评论
python通过将py文件转为so实现代码加密_Python_关耳_InfoQ写作社区