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

2024-01-04 09:48:43 +08:00
 yinlei212

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

已知的分发场景:

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

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


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

如以上理解有误请斧正。
akaHenry
2024-01-05 17:08:35 +08:00
@yinlei212 使用 Cython 单独编译一个 .so 的二进制授权+验证库:

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


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

目前相对还是 pyinstaller 算成熟的

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

https://tanronggui.xyz/t/1005684

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

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

© 2021 V2EX