[困惑] 写好的 Python 应用如何分发?

316 天前
 yinlei212

场景: 我写好了一个应用的所有代码,我需要进行分发给我的客户,但是我不想让他们得到源码。请问如何操作?, 有没有全平台统一方案(win/mac/linux)?

已知的分发场景:

  1. 源代码分发,直接上传 pypi ,或者 git 让使用。(源码分发不合适)
  2. windows 的话打包成 exe 进行分发(但是这个仅仅只是 windows 平台的)。
3915 次点击
所在节点    Python
33 条回复
JavaGym
316 天前
pywebio 做成网页
hanyu2pomelo
316 天前
pyarmor 加密后,打包个镜像
xxq2334
316 天前
@Alicewish 这个好
GeekGao
316 天前
@locoz pyarmor
usiantein
315 天前
这个主题我有相关实践经验。我们之前做的一个 Python package 也是需要分发到客户的机器上安装,为了保护 python 源代码,我们最后采用的方案是 Cython 编译:将 py 文件编译成 so 二进制,最后 setup.py 打包出来的 wheel 文件中,都是 so 文件。具体可以参考这个 blog: https://art-vasilyev.github.io/posts/protecting-source-code/
yinlei212
315 天前
总结下:
Python 没有一个语言级别的代码混淆解决方案,就 Pydantic 而言 是鼓励代码开源的。

总结上面 V 友们的方案:
1. pyinstaller 打包, -- 需要各平台单独打包。有反编译风险。
2. 用 Cython 将 py 编译成 .pyd/.so ->在用 pyinstaller 进行打包 。 -- 各平台单独打包分发、反编风险小
3. pyarmor 是一个专业混淆代码库,也是编译成字节码然后用-> pyinstaller 打包分发 ---- 各平台单独打包分发、反编风最小
4. Nuitka 直接使用 Clang 进行编译运行。


我的结论:
1. 就 安全性而言使用 3 方案 pyarmor 比较好;
2. 就 简单易用性而言 4 方案 Nuitka 是不错的方案。

如以上理解有误请斧正。
akaHenry
315 天前
@yinlei212 使用 Cython 单独编译一个 .so 的二进制授权+验证库:

1. 可以是填授权码+验证的, 也可以是发 HTTP + 在线检查的.
2. 你的 main() 每次都检查 .so 里的 授权方法, 如果失败, 就不让用.


做到这样, 基本就低成本保护了. 大部分代码, 都没啥保护价值. 只保护最核心的部分+核心链路.
usiantein
315 天前
@yinlei212 第 2 点中,pyinstaller 不是必要的,只需要写好 setup.py 文件,用 python3 setup.py bdist_wheel 就能打包,结合一些 CI 工具( e.g., GitHub Action ),可以针对 win/mac/linux 平台打出对应的分发包。
usiantein
315 天前
@yinlei212 另外,除了用 Cython 编译每个 .py 源文件外,我们还在整个 package 的入口( i.e., __init__.py )引入了 HTTP 认证,只要用户需要 import 我这个 package ,就需要进行 HTTP 认证,这样当我们不想让客户继续使用这个 package 时,将 HTTP 认证的结果返回为 False 就行了。
qixinwuchen
315 天前
借楼问下,op 说的 python 应用指的 python 脚本? 还是 python web 项目? 如果想对使用 django 框架开发的 web 项目进行加密,上面的方式能做到吗?
qixinwuchen
315 天前
@usiantein 请问,假如是复杂的 django web 项目, 能用这种方式加密吗? 对每个 py 文件打包后各个 package 的依赖关系还能保持吗
usiantein
313 天前
@qixinwuchen 我不太明白你这里所说的「 package 的依赖关系」具体指的是什么,Cython 编译这个技术是针对 Python 语言的,我理解跟什么类型的 web 项目无关。你也可以这么理解,编译后和编译前,源代码的调用方式、启动方式没有任何改变,只是所有的 .py 文件被替换成功能一致的 .so 二进制文件。
iorilu
312 天前
注意是 python 社区公认, python 就应该开源, 所以核心大佬们从来不愿意研究什么加密, 混淆, 打包二进制之类的事情

目前相对还是 pyinstaller 算成熟的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1005684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX