V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lihongjie0209
V2EX  ›  程序员

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

  •  
  •   lihongjie0209 · Dec 21, 2019 · 11328 views
    This topic created in 2319 days ago, the information mentioned may be changed or developed.

    Java 有 fatjar js 有 webpack

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

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

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

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

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

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

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

    不是这样?
    secondwtq
        31
    secondwtq  
       Dec 22, 2019
    楼主 Java 用得这么溜用啥 Python…居然还有推荐 Go 的,简直是故意气楼主
    lihongjie0209
        32
    lihongjie0209  
    OP
       Dec 22, 2019
    @secondwtq 写个小工具当然不用 java,go 也可以, 只是不熟悉。
    loginv2
        33
    loginv2  
       Dec 22, 2019
    我记得以前狗阿根廷就是打包的 python 不知道那种是怎么弄的
    deorth
        34
    deorth  
       Dec 22, 2019
    @loginv2 #33 那个是文件夹里有一个 portable 版的 py2 带依赖,外加对应操作系统 的启动脚本
    anewg
        35
    anewg  
       Dec 22, 2019
    docker 笑了,干脆让客户自己写代码去吧
    wzwwzw
        36
    wzwwzw  
       Dec 22, 2019
    @vest8 onedir 模式可以,就是要打包成压缩包了,有时候客户面对一个压缩包也是懵逼的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1431 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 23:56 · PVG 07:56 · LAX 16:56 · JFK 19:56
    ♥ Do have faith in what you're doing.