【问题标题】:Is it possible to minify python code like javascript?是否可以像 javascript 一样缩小 python 代码?
【发布时间】:2019-02-13 07:49:30
【问题描述】:

Python 是一种脚本语言。很难保护 python 代码不被复制。不需要 100% 的保护,但至少可以减缓那些有恶意的人。是否可以像今天的 javascript 前端代码那样缩小/丑化 python 代码?

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

【问题讨论】:

  • JS 没有被缩小来混淆它。由于有效负载大小,它被缩小以改善渲染时间。
  • 注意:您始终可以分发已编译的字节码文件,而不是原始源文件。它只是混淆(就像缩小一样,很多都可以反转),并且具有类似的优点(有时更小,而且总是更快,因为它节省了重新解析/编译代码所花费的时间)。
  • 缩小和丑化都不是复制保护。它们只会增加修改代码所需的资源。
  • @user781486 我投了反对票,因为这个问题没有任何意义。 1)缩小和混淆是不同的。 2)服务器端代码不需要缩小。 3) 混淆代码不会妨碍不良行为者。
  • @erip 这个问题对我来说很有意义。我和 OP 有同样的问题:试图复制保护,或者尽可能接近。在我的行业中,不择手段的抄袭和削弱是司空见惯的。我有兴趣隐藏二进制文件中显示的概念,其中仍然可以读取类和变量名。 1)在这种情况下,做任何一个的工具都会起作用。 2)如果我没记错的话,在微控制器上运行的较小的 CircuitPython 消耗的可用内存较少。 3)它可能足以阻止复制者。这个问题在某些情况下是有效的。

标签: python minify


【解决方案1】:

当然,你可以丑化它,但鉴于 python 依赖于语法缩进这一事实,你无法进行等效的缩小(在 JS 中很大程度上依赖于删除所有空格)。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 网站/应用程序并不是编写代码(Python 或其他)的唯一上下文。许多代码在用户的计算机上运行,​​因为他们安装了您的应用程序/库/脚本/任何东西。
    【解决方案3】:

    我会回答我自己的问题。

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

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

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

    【讨论】:

    • 为什么投反对票?答案有什么问题?如果投反对票的人解释未来改进的原因会很好。
    • 我不是反对者,但这里的标准通常需要更多内容来回答,而不是简单地链接到场外内容。由于您没有实际使用过这些工具,也不能对它们说太多,因此这并没有真正提供太多内容。邀请其他人评论他们的有效性并没有真正的帮助,因为答案应该作为问题的答案而独立存在; cmets中的讨论只应该是为了讨论对答案的改进(cmets本身经常在以后被删除)。
    • 谢谢。您的反馈很有价值。答案似乎缺乏但对我自己仍然有用。我把它放在我将来参考我自己的问题。
    • 还有python-minifier
    【解决方案4】:
    1. 从仅分发 pyc 文件开始怎么样?这些是 Python 解释器出于性能原因创建的文件——它们的加载时间比 .pys 快——但对于普通用户来说,它们很难破译。
    python -m compileall .
    
    1. 通过使用 Cython 编译您的 python src 来提高安全性。要“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 使用这种方法;我遇到了使用不同模块的各种陷阱。

    【讨论】:

      【解决方案5】:

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

      虽然这可能是保护商业机密的一种方式,但也存在一些硬性限制。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        • 2017-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        相关资源
        最近更新 更多