文章目录
- 前言
- 使用 Cython 加密 Python 代码
- 环境
- Python 源代码
- 编写 Cython 编译配置文件
- 编译
- 查看输出文件
- 使用
- 问题
- `error: Microsoft Visual C++ 14.0 or greater is required`
- `pyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory`
- `dynamic module does not define module export function`
- 拓展
- `.py .pyc .pyd .so .pyx` 的区别
- `.py 文件`
- `.pyc 文件`
- `.pyd 文件`
- `.so 文件`
- `.pyx 文件`
- 个人简介
前言
- 在《如何避免别人反编译我们的 Python .exe 程序》一文中我们介绍了两种给我们 Python 源代码加密的两种方式,本文我们主要介绍如何使用
Cython
加密源代码,虽然Cython
的作用主要是为了提高代码的运行效率,但是也对源代码有一定的加密效果。
使用 Cython 加密 Python 代码
环境
- win11
- Python 3.x
Python 源代码
# dependency.py
def some_function(x, y):
return x * y
# example.py
from dependency import some_function
def add(x, y):
return x + y + some_function(x, y)
if __name__ == '__main__':
print(add(3, 4))
编写 Cython 编译配置文件
# setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
# 程序名
name='test',
# 需要编译的脚本列表
ext_modules=cythonize(
[
"dependency.py",
"example.py",
# ...
],
# Python 版本
language_level=3
),
)
编译
python setup.py build_ext --inplace
命令的作用是在当前目录中构建 C/C++ 扩展模块,并将编译后的模块放置在当前目录中,以便在开发过程中进行测试和调试。
# 执行成功日志
版权所有(C) Microsoft Corporation。保留所有权利。
[1/2] Cythonizing dependency.py
[2/2] Cythonizing example.py
dependency.c
正在创建库 build\temp.win-amd64-cpython-312\Release\dependency.cp312-win_amd64.lib 和对象 build\temp.win-amd64-cpython-312\Release\dependency.cp312-win_amd64.exp
正在生成代码
已完成代码的生成
example.c
正在创建库 build\temp.win-amd64-cpython-312\Release\example.cp312-win_amd64.lib 和对象 build\temp.win-amd64-cpython-312\Release\example.cp312-win_amd64.exp
正在生成代码
已完成代码的生成
查看输出文件
- 可以看到编译完成后,我们在当前目录生成了
.c
源文件和.pyd
的二进制windows 动态链接库文件
,在linux
环境下生成的是.so
为后缀的共享对象文件。
使用
.so 文件和 .pyd 文件
使用和原.py
文件使用方式一致,但.pyd
文件名需要和原文件名保持一致。·
# run.py
import example
if __name__ == '__main__':
print(example.add(3, 4))
问题
- 下面是实践过程中遇到的一些问题,可以参考:
error: Microsoft Visual C++ 14.0 or greater is required
- 问题很明显,我们需要安装
Microsoft Visual C++14.0或更高版本
。 - 下载链接:https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/
- 安装并选择对应的组件进行安装:
pyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory
- 这是因为我们还需要另外两个组件,继续使用
visualstudio
工具进行安装:
- 由于电脑系统是
win11
,所有选择win11 SDK0
。
dynamic module does not define module export function
在 run.py 中使用 .pyd 时,需要和原文件名称保持一致,否则会出现如上错误,比如上面的示例中原文件为 example.py 则生成的链接文件应该为 example.pyd
拓展
.py .pyc .pyd .so .pyx
的区别
.py 文件
- 标准的 Python 源代码文件,包含 Python 代码。你可以使用文本编辑器(如Notepad++、Sublime Text、Atom等)来编辑这些文件。
.pyc 文件
- Python 编译后的字节码文件。当你运行一个 .py 文件时,Python 解释器会将其编译成字节码,然后将字节码保存到 .pyc 文件中,以便下次运行时可以更快地加载。这些文件是平台无关的,因此可以在不同的操作系统上共享。
.pyd 文件
- Windows 平台上的 Python DLL 文件。它们包含编译后的 Python 模块,通常是用C、C++或其他语言编写的扩展模块。这些文件允许 Python 与底层操作系统或硬件进行交互,例如,访问操作系统的API或使用硬件设备。
.so 文件
- 类Unix系统(如Linux)上的共享对象文件,类似于 Windows 上的 DLL 文件。它们通常是使用 C 或 C++ 编写的 Python 模块的编译版本。这些文件通常用于扩展 Python 的功能,以便与底层系统进行交互或提高性能。
.pyx 文件
- Cython 代码文件。Cython 是一种使 Python 代码能够与 C 语言进行混合编程的工具。.pyx 文件包含了同时具有 Python 和 C 语法的代码,可以通过 Cython 编译器转换为 C 代码,然后编译成 Python 可执行模块(.pyd 或 .so 文件)。
个人简介
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。
🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。
💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。
🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。
📖 保持关注我的博客,让我们共同追求技术卓越。