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

大家如何打包 Python 程序的

  •  
  •   ysicing ·
    ysicing · 2017-08-17 18:49:50 +08:00 · 3995 次点击
    这是一个创建于 2452 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家通常如何打包 python 程序的,避免不同环境的差异(Centos/Ubuntu)。
    
    1.Pyinstaller
    2.Docker
    3.放弃用 Go 重写?
    
    15 条回复    2017-08-18 11:59:35 +08:00
    redapple0204
        1
    redapple0204  
       2017-08-17 18:51:34 +08:00
    同平台的 python 程序能有什么差异....
    YUX
        2
    YUX  
       2017-08-17 18:52:34 +08:00
    Docker
    dbow
        3
    dbow  
       2017-08-17 18:52:42 +08:00
    virtualenv + 自己从源代码 build 的 python2.7 , 在线上跟线下都保持一致.
    zhangchioulin
        4
    zhangchioulin  
       2017-08-17 21:25:17 +08:00 via iPhone
    第 3 条是乱入吗……
    yuanfnadi
        5
    yuanfnadi  
       2017-08-17 21:33:13 +08:00 via iPhone
    docker 大法好
    VShawn
        6
    VShawn  
       2017-08-17 21:42:00 +08:00 via Android
    4 用汇编重写
    janxin
        7
    janxin  
       2017-08-17 21:42:18 +08:00   ❤️ 1
    如果是服务器程序,docker
    如果是桌面程序,pyinstaller
    SuperMild
        8
    SuperMild  
       2017-08-17 22:49:17 +08:00
    以后还是转 Go 吧,语言和标准库非常稳定(可以预见 Go 2、Go 3 也很容易向下兼容),打包方便,运行效率高,发展速度也快(第三方库越来越多)。
    mckelvin
        9
    mckelvin  
       2017-08-17 23:31:07 +08:00
    你说的不同发型版本环境的差异,只有含 C/C++ 扩展的 Python package 才有这个顾虑吧?

    我个人的最佳实践是,构建环境和线上环境都在 docker 里,但不一定同一个 docker image(比如前者需要构建所需的编译软件、但后者不需要),打包一份 wheel 格式,一份 tar.gz 源代码。然后把打包好的文件上传到内网 pypi 源(用 devpi 搭的)。最后构建线上运行的 docker images 时从 devpi 安装 python 包。
    ysicing
        10
    ysicing  
    OP
       2017-08-18 08:25:14 +08:00
    @redapple0204 有些包还是存在差异的


    @zhangchioulin 不是,主要就是有些依赖的包的差异太蛋疼了,有时候不好排查,然后就有小伙伴提建议用 go 重写

    看来大家也是用 docker
    XIVN1987
        11
    XIVN1987  
       2017-08-18 09:36:56 +08:00
    Go 语法那么丑你们都能接受??
    nicevar
        12
    nicevar  
       2017-08-18 09:42:41 +08:00
    python 打包确实麻烦,特别是复杂的项目,我记得六七年前某导师带领学生用 python 做了一个航空类的项目,后面打包遇到问题让我去解决,我一看那个打出来的包 500 多 M,引用了一大堆库,真是懵了
    用 Go 重写不太现实的,如果不是服务器程序,很多用到的库 Go 连个影子也没有,也没人去写
    metaquant
        13
    metaquant  
       2017-08-18 09:58:54 +08:00 via iPhone
    @XIVN1987 我以为就我一个人这么想,哈哈,感觉 go 的语法真是丑,还不如 java
    weakish
        14
    weakish  
       2017-08-18 11:44:02 +08:00
    平台类似的话,仅仅是 pip 包依赖问题, 先尝试 Pipfile.lock, 不行再试其他。
    Pyinstaller 一般更多地是解决 cross os 打包发布的问题。
    Docker/lxc 则是解决各种 pip 包以外的依赖很复杂的问题。
    ysicing
        15
    ysicing  
    OP
       2017-08-18 11:59:35 +08:00
    @XIVN1987 @metaquant @nicevar 没用过 Go 哈哈。


    @weakish 还是搞 docker 省力
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   759 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:28 · PVG 04:28 · LAX 13:28 · JFK 16:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.