V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lihongjie0209
V2EX  ›  程序员

Python 有什么打包工具可以把依赖都打包进去

  •  
  •   lihongjie0209 · 2019-12-21 15:51:03 +08:00 · 10138 次点击
    这是一个创建于 1797 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Java 有 fatjar js 有 webpack

    Python 有什么工具可以把需要的依赖都打包到一起, 用户可以直接使用的, 不需要再手动安装依赖。

    最好是生产级别的, 小工具就算了。

    如果没有, 那么 Python 社区基于什么样的想法没有实现这个呢?

    36 条回复    2019-12-22 17:01:07 +08:00
    jeffersonpig
        1
    jeffersonpig  
       2019-12-21 15:54:48 +08:00
    pyinstaller?
    ClericPy
        2
    ClericPy  
       2019-12-21 15:57:11 +08:00
    shiv?
    lihongjie0209
        3
    lihongjie0209  
    OP
       2019-12-21 15:58:00 +08:00
    @jeffersonpig #1
    听说过, 但是应该不属于生产级别的工具吧, 没见过很多项目在用
    webpack 和 fatjar 应该说是一般项目的标配了
    zjsxwc
        4
    zjsxwc  
       2019-12-21 16:00:13 +08:00
    python 打包成一个 exe 类似的可执行文件?
    lihongjie0209
        5
    lihongjie0209  
    OP
       2019-12-21 16:01:04 +08:00
    @ClericPy #2 我研究一下, 看了一下 readme, 貌似 C 扩展的包会有问题
    lihongjie0209
        6
    lihongjie0209  
    OP
       2019-12-21 16:01:46 +08:00
    @zjsxwc #4 不是, 是把所有的依赖都打包到 ./lib 下面
    CallMeReznov
        7
    CallMeReznov  
       2019-12-21 16:08:28 +08:00
    pyinstaller 之前处理那种多重引用也会报错,不过有人说可以把需要的包复制到目录下编译.
    我也是听说,木有尝试过
    JasonEWNL
        8
    JasonEWNL  
       2019-12-21 16:36:01 +08:00 via iPad
    翻译一下就是 “用户只要拿到代码就能跑”?如果是这个意思可以考虑直接使用 venv,会直接创建依赖的 bin 和 lib。(而且有个好处就是用户能一直用你配置的依赖库版本,防止自带的库版本不一致产生的各种售后问题。)
    gwy15
        9
    gwy15  
       2019-12-21 16:49:11 +08:00   ❤️ 1
    pex / shiv / xar
    这几个都差不多,我用的是 pex。

    pex 实现原理是,python 支持把代码放到一个 zip 文件里面,直接执行 zip 文件。所以把第三方依赖和你的源代码打包进去,声明入口就可以直接跑这个 pex 文件。当然使用的解释器还是你的系统级别的。所以 pex 文件比较小,不需要包含解释器(像 venv 之类的解决方法)。

    对于涉及到 C 的库,我个人使用到的都是纯 py 的库,没有用到 C 结合的,不过应该也是支持的,只能你找找相关帖子了。
    niubee1
        10
    niubee1  
       2019-12-21 16:52:14 +08:00
    涉及 C 的库几乎都会有问题,因为编译目标毕竟是不一样的,都会需要重新编译的过程
    gwy15
        11
    gwy15  
       2019-12-21 16:56:24 +08:00
    另外 pex 存在一定的问题是,资源文件( templates, static, etc.) 打包到 pex 里面是不识别的,需要独立出来。

    要分发面向用户的话,pex 因为需要用户自己装解释器,所以最好的方法还是用 pyinstaller 直接打包成二进制文件
    zero469
        12
    zero469  
       2019-12-21 17:14:12 +08:00
    蹲点同求
    sunwei0325
        13
    sunwei0325  
       2019-12-21 17:18:37 +08:00
    pyinstaller, 都 6k 多个 star 了, 放心用吧
    tt67wq
        14
    tt67wq  
       2019-12-21 17:22:05 +08:00
    还是直接 docker 吧
    Jero
        15
    Jero  
       2019-12-21 17:29:37 +08:00
    客户端程序或工具,可以考虑 pyinstaller
    masker0817
        16
    masker0817  
       2019-12-21 18:02:29 +08:00 via Android
    Docker
    Marsss
        17
    Marsss  
       2019-12-21 18:15:56 +08:00
    如果在一开始考虑到这个问题,然后直接用 python 自带的 venv 就不存在这个问题了。虚拟环境中的 site-packages 只有项目所用到的包,没有多余的东西,直接把这个环境拷贝给用户就行了。
    建议新建一个 venv,安装一遍依赖。python 自带,还是用原来的 pip 安装依赖,切换个国内源,很香的。
    blless
        18
    blless  
       2019-12-21 18:31:17 +08:00 via Android
    🙄我之前就是想写个小工具给没有程序基础的朋友用,一轮工具试过去都还不行,干脆用 go 重写了一遍
    wangyzj
        19
    wangyzj  
       2019-12-21 20:13:15 +08:00
    pyinstaller
    lihongjie0209
        20
    lihongjie0209  
    OP
       2019-12-21 20:47:28 +08:00
    @tt67wq #14 你想让我的用户(不会依赖管理的)安装 docker ?
    ClericPy
        21
    ClericPy  
       2019-12-21 21:27:12 +08:00
    @lihongjie0209 #5 C 扩展本来就不是跨平台的, 毕竟得 build, 保证打包机环境一致就行了. shiv 是 linkedin 很早以前按 PEP 441 搞的
    wzwwzw
        22
    wzwwzw  
       2019-12-21 22:05:50 +08:00
    用 go 吧。pyinstaller 打包成 exe,特别慢。
    fox0001
        23
    fox0001  
       2019-12-21 22:11:17 +08:00 via Android
    @wzwwzw #22 正解~
    20150517
        24
    20150517  
       2019-12-21 22:26:17 +08:00 via Android
    docker
    wuwukai007
        25
    wuwukai007  
       2019-12-21 22:29:45 +08:00 via Android
    什么 docker 啊,能审题吗各位?
    tfdetang
        26
    tfdetang  
       2019-12-21 23:01:31 +08:00
    你也没说大概什么样的程序,需要在什么样的环境下运行,linux? win? 有不少包都是有系统依赖的,又不是光把 python 装好就行的。 比较复杂的程序都建议用 docker 来做交付,省的麻烦自己
    hhhsuan
        27
    hhhsuan  
       2019-12-21 23:32:26 +08:00
    venv 就是干这事的啊,开发完把整个环境打包就行了。
    sunwei0325
        28
    sunwei0325  
       2019-12-22 02:44:40 +08:00
    来大兄弟, 你们两个把这套生产系统从 python 用 go 重写一下, 应该不复杂吧? 两天够吗
    @wzwwzw
    @fox0001
    vest8
        29
    vest8  
       2019-12-22 08:20:11 +08:00
    @wzwwzw 用 onedir 模式吧,比 onefile 快不少,,
    xingheng
        30
    xingheng  
       2019-12-22 10:12:36 +08:00 via iPhone
    不知道是不是我理解有错,为什么不直接 pip setup-tools,把依赖写到 setup.py 里面。

    不是这样?
    secondwtq
        31
    secondwtq  
       2019-12-22 12:44:19 +08:00
    楼主 Java 用得这么溜用啥 Python…居然还有推荐 Go 的,简直是故意气楼主
    lihongjie0209
        32
    lihongjie0209  
    OP
       2019-12-22 13:03:42 +08:00
    @secondwtq 写个小工具当然不用 java,go 也可以, 只是不熟悉。
    loginv2
        33
    loginv2  
       2019-12-22 13:08:09 +08:00
    我记得以前狗阿根廷就是打包的 python 不知道那种是怎么弄的
    deorth
        34
    deorth  
       2019-12-22 13:43:37 +08:00
    @loginv2 #33 那个是文件夹里有一个 portable 版的 py2 带依赖,外加对应操作系统 的启动脚本
    anewg
        35
    anewg  
       2019-12-22 15:56:18 +08:00
    docker 笑了,干脆让客户自己写代码去吧
    wzwwzw
        36
    wzwwzw  
       2019-12-22 17:01:07 +08:00
    @vest8 onedir 模式可以,就是要打包成压缩包了,有时候客户面对一个压缩包也是懵逼的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3548 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.