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 · 5085 次点击
    这是一个创建于 1853 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 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,搞定
    l4ever
        15
    l4ever  
       2019-10-24 12:52:15 +08:00
    1. pyinstaller 没你说的兼容性问题
    2. pip install -r requestment.txt
    l4ever
        16
    l4ever  
       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   ·   实用小工具   ·   1333 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:46 · PVG 01:46 · LAX 09:46 · JFK 12:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.