如何把 Python 源码打成离线使用包? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
omph
V2EX    Python

如何把 Python 源码打成离线使用包?

  •  1
     
  •   omph 2019-10-24 10:06:13 +08:00 5878 次点击
    这是一个创建于 2244 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 linux 下写的 python 代码,想提供给 windows 平台使用
    不想打包成 exe,感觉平台兼容性(要考虑 win7、win10 )并不好
    目前的想法是:让对方装好 python,我再写一个批处理脚本,直接执行起来就好
    问题在于,要能把依赖的库源码也打包进去,并能直接使用,不需要使用者再去安装

    有没有现成的工具实现?
    21 条回复    2019-10-24 17:11:48 +08:00
    solxnp
        1
    solxnp  
       2019-10-24 10:15:06 +08:00
    docker?
    ClericPy
        2
    ClericPy  
       2019-10-24 10:15:27 +08:00   1
    去看 linkedin 的 shiv 库, 会打包成一个 pyz 文件, 以前我就是这么让别人安装 Python, 其他源码加依赖都是用我这个 pyz
    下面这个是打包 Django 成 pyz 的方式
    https://shiv.readthedocs.io/en/latest/django.html

    如果把官方那个 Windows 嵌入式绿色版解释器一起给对方, 甚至连安装 Python 都不需要, 这两种方式我还真都琢磨过
    imn1
        3
    imn1  
       2019-10-24 10:20:44 +08:00
    实际上,对于不懂 python 的人来说,仍然是打包 exe 更好
    懂的人,直接源码扔过去就行

    扔源码给不懂 python 的人,后面有得烦
    omph
        4
    omph  
    OP
       2019-10-24 11:31:12 +08:00
    @solxnp 感觉有点重口味,使用者可能是小白
    @ClericPy 多谢!去看看
    @imn1 之前就是打包成 exe,有点重,把 python 也打包进去了,而且我用的是 linux,在虚拟机中测试 windows 各版本 exe 能否顺利运行实在难受
    chengxiao
        5
    chengxiao  
       2019-10-24 11:33:38 +08:00
    给个提醒
    pyinstaller win10 下打的 exe 包 并不能兼容 win7....需要在 win7 下再打一次
    wangyzj
        6
    wangyzj  
       2019-10-24 11:34:51 +08:00
    @ClericPy 和 pyinstaller 比呢?
    ClericPy
        7
    ClericPy  
       2019-10-24 11:41:19 +08:00
    @omph 不用客气, 之前也做过相关操作而已, 部分历史代码可以看 https://github.com/ClericPy/distribute-python-on-windows 不过不知道还可以用么, 这库的主要操作就是去官网下载 embed zip, 然后解压缩, 然后打包 shiv , 然后生成一个 run.bat 用来执行, 你稍微改改就好了


    @wangyzj 两码事, shiv 的用处接近于虚拟环境的 zip 化, 打包成单个 pyz 文件以后, 整个环境的所有第三方依赖就独立于全局环境了. pyinstaller 只是一个编译工具, 而且是把解释器一起编译进去的, shiv 是不带解释器的, 所以 pyz 文件很小
    ClericPy
        8
    ClericPy  
       2019-10-24 11:43:24 +08:00
    @chengxiao 你这个结论是最近的么, 之前我还真在 Windows10 上打包了给 Windows7 的人用过, 是正常通过的.

    不过你说的这个情况在 3 年以前, pyinstaller 还不稳定的时候确实存在, 所以每次打包为了兼容性, 我会把需要的所有 VC100.dll 什么的一起带上, 以及 pyqt 打包会缺失的 platform.dll 也都带进去, 那年代为了兼容性真的煞费苦心了.

    前段时间问过群友, 说这些 bug 在新版本 pyinstaller 都已经自动兼容好了
    really28
        9
    really28  
       2019-10-24 11:43:55 +08:00
    老哥你的头像不错哦
    pcbl
        10
    pcbl  
       2019-10-24 11:47:29 +08:00   1
    exe 通用性才是最好的,别搞那些歪门邪道了。pyinstaller -F win7 win8 win10 都可以正常运行 打包后的 exe 也不大
    wangyzj
        11
    wangyzj  
       2019-10-24 11:50:16 +08:00
    @ClericPy 类似 virtualenv 的环境包?
    ClericPy
        12
    ClericPy  
       2019-10-24 11:55:56 +08:00
    @wangyzj https://github.com/linkedin/shiv 你看看不就知道了, PEP 441 里也讲的很清楚, 把所有第三方包打包成一个压缩文件 xx.pyz, 然后在有解释器的环境里就可以像 bin 一样直接运行了, 类似于
    $ ./boto.pyz
    然后根据参数, 在 pyz 文件里带上要执行的 py 文件的函数, 就可以整个项目打包成类似可执行文件的 pyz

    懒得学就直接看上面那个 distwin 吧, 是一种协议, 允许 Python 解释器直接运行它, 并带上它里面包含的环境, shiv 后期也把局部环境被全局弄脏的 bug 给修复了, 变成了局部优先, 所以尽量用新版本

    还有个小地方要注意, 虽然 Python 代码是跨平台的, 但是如果遇到需要编译 C 文件的库, 就没法跨平台了, 毕竟编译的玩意是不兼容的
    Osk
        13
    Osk  
       2019-10-24 12:14:54 +08:00   2
    我直接使用 Windows Embedded zip 解释器环境做开发...

    然后把解释器 + 启动脚本打包给对方, 还行.
    love
        14
    love  
       2019-10-24 12:26:22 +08:00
    我以前这么分发过,下载个绿色版单目录 python,把自己的代码放进去,做了 BAT,搞定
    luckyc
        15
    luckyc  
       2019-10-24 12:52:15 +08:00
    1. pyinstaller 没你说的兼容性问题
    2. pip install -r requestment.txt
    luckyc
        16
    luckyc  
       2019-10-24 12:53:22 +08:00
    ```
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    pip install -r requirements.txt
    ```
    chengxiao
        17
    chengxiao  
       2019-10-24 13:35:00 +08:00
    @ClericPy 是最近 上个月打的 不过可能是某些特定包引起的
    CallMeReznov
        18
    CallMeReznov  
       2019-10-24 13:39:22 +08:00
    没见过打包成 EXE 后 在 7 和 10 上有执行兼容的问题的
    不过 pyinstaller 在 python 不同版本上到是有很多问题,我之前用 3.6 可以用 3.7 就不行
    castle6610
        19
    castle6610  
       2019-10-24 15:54:54 +08:00
    @chengxiao 而且还分 x86 和 x64,也要分别打包。如果在 xp64 的打包的,在 xp32 上居然也不能运行。。。。
    christin
        20
    christin  
       2019-10-24 15:58:29 +08:00 via iPhone
    @l4ever #15 @l4ever #15 有的包莫名装不上 像 dlib 恶心人
    bearxu
        21
    bearxu  
       2019-10-24 17:11:48 +08:00
    我把依赖打包放进 packages.zip , 加上 python embeddable 版
    基本就相当于 绿色版软件了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4124 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 10:12 PVG 18:12 LAX 02:12 JFK 05:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86