Python 有什么打包工具可以把依赖都打包进去 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
lihongjie0209
V2EX    程序员

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

  •  a href="Javascript:" Onclick="downVoteTopic(631074);" class="vote">
  •   lihongjie0209 2019-12-21 15:51:03 +08:00 10785 次点击
    这是一个创建于 2125 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       219-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 /td>
        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     Solana     5736 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 02:50 PVG 10:50 LAX 19:50 JFK 22:50
    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