是否可以像 javascript 那样缩小 python 代码?

Is it possible to minify python code like javascript?

Python 是一种脚本语言。很难保护 python 代码不被复制。不需要 100% 的保护,但至少让那些有恶意的人慢下来。 minify/uglify python 是否可以像今天 javascript 前端代码那样编写代码?

编辑:python 代码将用于 Raspberry Pi,而不是服务器。在 raspberry pi,任何人都可以取出 SD 卡并访问 python 代码。

当然,你可以将它变丑,但考虑到 python 依赖语法缩进这一事实,你无法进行等效的缩小(这在 JS 中主要依赖于删除所有空格)。

题外话,但 JS 已缩小以使其下载速度更快,而不是混淆它。

python 在服务器端执行。虽然有时故意混淆代码很有趣(查看 perl 混淆 ;),但服务器端代码永远不需要它。

如果您试图向某人隐藏您的 python 但他们已经可以访问存储它的目录和文件,那么您遇到的问题比代码混淆更大。

我会回答我自己的问题。

我发现以下软件工具可以完成这项工作。我没有尝试过,所以我无法评论它们的效果。欢迎评论其有效性。

https://liftoff.github.io/pyminifier/

https://mnfy.readthedocs.io/en/latest/

  1. 从只分发 pyc 文件开始怎么样?这些是由 Python 解释器出于性能原因创建的文件——它们的加载时间比 .pys 快——但对于临时用户来说,它们很难破译。
python -m compileall .
  1. 通过使用 Cython 编译您的 python 源代码来提高安全性。要“cythonize”你的代码,运行 每个模块上的 Cython + GCC。 init.py 文件必须保持原样以保持模块导入工作。一个愚蠢的 Hello world 示例:
$ cython helloworld.py -o helloworld.c
$ gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python3.7 -o helloworld.so helloworld.c

YMMV 使用这种方法;我已经 运行 使用不同的模块陷入各种困境。

Nuitka.net 是将 python 代码转换为已编译目标代码的完美方式。这使得逆向工程和暴露你的算法变得非常困难。 Nuitka 还可以生成非常便携的独立可执行文件。

虽然这可能是保护商业秘密的一种方式,但它有一些硬性限制。

a) 一些 python 库已经是二进制发行版,很难捆绑在独立的 exe 中(例如 xgboost、pytorch)。

b) 二进制包的广泛 pip 分发是一个非常令人沮丧的练习,因为它链接到 cpython 库。许多 linux 和通用构建是等待映射和记录的广阔荒地。

至于否决票,请考虑 1) 并非所有 python 运行 都在服务器上 - 有些 运行 在边缘,2) 非开源作者需要保护他们的知识 属性,3) 越小,安装越快。