Python 项目移植到其他机器,要求全 Linux 系统适配 - V2EX
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
akmonde
V2EX    Python

Python 项目移植到其他机器,要求全 Linux 系统适配

  •  
  •   akmonde 2019-04-29 23:31:49 +08:00 7330 次点击
    这是一个创建于 2423 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT,领导要求移植某个项目,要求移植到不同的 linux 机器上都能适配。 领导的意思是,python 本来全平台通用,完全能打包到内网无人值守安装,完全无错完成。 我这边本来想的是,用 virtualenv 直接打包,但是发现几个坑,打包好的很多文件里,有些是直接引用的系统软 link:

    /home/lab/venv/local/bin 

    引用的是:

    lrwxrwxrwx 1 lab lab 18 Apr 29 07:53 bin -> /home/lab/venv/bin 

    换到新环境下,要是不存在改文件,或者环境不同换了位置,该如何处理。 领导应该会要求,不能固定在某一个目录,这个我不知道怎么弄。

    另外,在安装库文件的过程中,领导要求把库文件弄下来,不能即时下载纠错。 我在安装某一些库文件的过程中,比如:

    pip install lxml pip install gevent 

    可能会出现部分报错,其实人工纠正还是不难,但是现在要求全部弄下来打包的话, 如何才能做到完全适配,比如缺啥底层文件,都加到这个文件夹里,做好链接,直接能用,适配全系统 linux。 领导还加了句,实在不行还可以判断下系统内核版本和系统版本再进行加载。

    另外,领导附加了要求,不能用镜像虚拟机 docker 之类的。

    很僵硬,我这边实在绝望,希望各位大佬能指点下。 在线等,很急,领导催的紧! 感谢!

    第 1 条附言    2019-04-30 16:38:56 +08:00
    我这儿暂时还是没搞定,但脑子有点懵,回复不过来了。
    感谢各位大佬的建议,现在就想先去适配主流 linux 发行版。
    关键有个点,我这边不能去安装啥管理器,来切换管理虚拟环境啥的。
    领导的意思是打包过去,不用下载啥新东西就能用。
    我想的是,能不能打包后,原生 linux 解压就能用,我暂时没找到这种东西。
    采用 virtual --relocatable 参数好像只能改变部分相对路径,直接移植新机器,由于软链接的位置可能不一样,还是找不到包。
    如果新环境没有准备一模一样的 python 环境路径的话,依然不行。
    最后注明一下,之所以不用 docker 等容器或者管理软件,是因为领导觉得新环境要考虑断网、离线,所以要求打包后,使用的时候不能借用第三方软件的,除非你能一起打包解压可用。
    48 条回复    2019-05-07 15:05:13 +08:00
    est
        1
    est  
       2019-04-29 23:33:21 +08:00 via Android
    docker 不行可以 runc
    akmonde
        2
    akmonde  
    OP
       2019-04-29 23:34:17 +08:00
    @est 他的意思是机器可能啥都没装,临时用没时间装,要求直接解压安装就能用。
        3
    tomczhen  
       2019-04-29 23:42:26 +08:00
    完全是张口就来虽然我不知道该怎么做,但是这个问题肯定很简单,简单抽空做一下,明天就要。

    就算是跨平台也是有 glibc 之类依赖,适配全系统 Linux 还是得分平台打包才能实现,更何况还有一些依赖库可能是动态编译,还会依赖系统 ssl 库之类的,对版本还有要求。

    用 pyinstaller 之类的工具能解决 一部分问题,不过也不是短时间马上就能搞定全系统 Linux 适配。
    tomczhen
    momo1999
        4
    momo1999  
       2019-04-29 23:45:00 +08:00
    virtualenv --relocatable
    不知道是不是这个
    reus
        5
    reus  
       2019-04-30 00:04:36 +08:00
    换 go,禁用 cgo,保证放到哪里都能跑。
    wevsty
        6
    wevsty  
       2019-04-30 00:13:52 +08:00
    既然有 docker 这样的东西干嘛不让用,自己造个轮子又麻烦,问题还多。

    如果不依赖于任何系统上特殊组件的话,可以通过 chroot,直接打包所有的依赖库,也许能解决问题。
    chinesestudio
        7
    chinesestudio  
       2019-04-30 00:15:29 +08:00 via Android
    全平台就搞 docker 镜像吧
    Cooky
        8
    Cooky  
       2019-04-30 00:18:28 +08:00
    miniconda,所有依赖库都用 conda 下载的二进制包
    Qzier
        9
    Qzier  
       2019-04-30 00:22:26 +08:00 via iPhone
    用 pyenv,连 pyenv 一起复杂,后面只需要改下环境变量。
    xiaoheijw
        10
    xiaoheijw  
       2019-04-30 00:47:15 +08:00
    pip download 可以下载全部依赖库
    xiaoheijw
        11
    xiaoheijw  
       2019-04-30 00:48:28 +08:00
    @xiaoheijw linux 底层依赖的话,可能你要写个 script 根据平台不同去安装
    blless
        12
    blless  
       2019-04-30 01:02:38 +08:00 via Android
    这要求小工具还是用 go 写过吧 pyinstaller 我当年愣是想打一个 win 包 没打出来
    prolic
        13
    prolic  
       2019-04-30 01:06:03 +08:00
    提供个思路,不知道可行不可行,虚拟环境文件夹打包然后走相对路径,该改的 env 都改掉,这都不行就看看 python 编译配置,没准就支持了
    miaoever
        14
    miaoever  
       2019-04-30 04:43:56 +08:00   1
    可以试试 https://github.com/facebookincubator/xar
    我们所有的 python binary 分发部署都使用 xar 格式, 无需依赖系统 Python 环境。
    kxjhlele
        15
    kxjhlele  
       2019-04-30 05:23:50 +08:00 via Android
    用 pypy 绿色版试试呢,不清楚你们的包支持不支持
    yegle
        16
    yegle  
       2019-04-30 05:35:13 +08:00
    cnnblike
        17
    cnnblike  
       2019-04-30 06:16:07 +08:00
    glibc 依赖不对可以让这个包跪在地上哭(我就这么被一个中老年版本的 linux 系统整哭过,就差没跪在地上求管理员爸爸升级系统了
    yanaraika
        18
    yanaraika  
       2019-04-30 06:37:50 +08:00
    docker 一步到位。别的 chroot 类解决方案都不成熟
    wenzhoou
        19
    wenzhoou  
       2019-04-30 06:43:39 +08:00 via Android
    采用了 docker 方案以后,你的问题就转移成怎么安装和维护 docker 了。
    liangzi
        20
    liangzi  
       2019-04-30 07:57:41 +08:00 via Android
    @cnnblike 嗯 前天因为跨发行版安装了个带 glibc 的包 系统瞬间就崩了
    zjsxwc
        21
    zjsxwc  
       2019-04-30 08:00:56 +08:00 via Android
    我记得 docker 没有对老 Linux 比如 centos6 支持吧,不符合楼主要求的。
    zjsxwc
        22
    zjsxwc  
       2019-04-30 08:04:43 +08:00 via Android
    楼上都说了用禁用 cgo 的 go 写是满足楼主需求的唯一途径了
    izoabr
        23
    izoabr  
       2019-04-30 08:22:43 +08:00
    你直接把依赖都打包进去不就得了,甚至 python 运行时都打包进去,赶上这样的领导该粗暴就粗暴。
    mengzhuo
        24
    mengzhuo  
       2019-04-30 08:25:46 +08:00 via iPhone
    你们还 too young
    Armv8 i386 mips armv5 怎么办?
    Windows FreeBSD NetBSD Darwin 呢?
    还敢叫全平台么?
    ik
        25
    ik  
       2019-04-30 08:30:44 +08:00 via iPhone
    我也投票 docker
    cat9life
        26
    cat9life  
       2019-04-30 08:36:42 +08:00   1
    这个要求简直就是给 docker 量身订做的 结果还不让用
    CallMeReznov
        27
    CallMeReznov  
       2019-04-30 08:38:47 +08:00   2
    领导指着哆啦 A 梦的四维空间袋说道"这口袋挺可爱,你也给我整一个呗"
    "我整你妈!"
    izoabr
        28
    izoabr  
       2019-04-30 08:56:32 +08:00
    @mengzhuo #24 感谢,这个我刚才还真没想到。
    就问题聊问题,如果是其它硬件平台,那应该是打多种包呀,我们装软件不都是 for x86/for armv8 那样多种包嘛。
    其实完全就是跟 pyinstaller 那样打包嘛。
    然后检查下依赖的库里有没有平台限制相关的,有的库是特定平台要求的。
    tt0411
        29
    tt0411  
       2019-04-30 08:58:05 +08:00
    你领导的需求完全可以实现, 我自己以前就实现过.
    tempdban
        30
    tempdban  
       2019-04-30 09:12:15 +08:00
    你老板就是让你自己弄个容器,拿 docker 做,自己 chroot 进去跑
    blless
        31
    blless  
       2019-04-30 09:16:41 +08:00 via Android
    docker 在老 centos 什么的系统支持可并不好,唯一途径就是禁用 cgo 的 go
    kimqcn
        32
    kimqcn  
       2019-04-30 09:22:49 +08:00
    全平台完全是拍脑袋说话,明确几个版本的操作系统,然后分别适配吧。
    sagaxu
        33
    agaxu  
       2019-04-30 09:40:40 +08:00 via Android
    @zjsxwc Java 也可以
    zjsxwc
        34
    zjsxwc  
       2019-04-30 10:30:09 +08:00
    @sagaxu

    misp cpu 的 linux 路由器上跑 java 基本不可能,golang 可以
    qinyusen
        35
    qinyusen  
       2019-04-30 10:45:14 +08:00
    先干掉那个不让用 docker 的需求。。。。

    脑子有坑么?现在 armv8 都有 docker 了。
    akmonde
        36
    akmonde  
    OP
       2019-04-30 10:48:00 +08:00
    @shuax https://www.jianshu.com/p/08c657bd34f1
    感谢,不过他不能使虚拟环境跨平台使用,只能本机移动位置?
    我换了机器就路径不对识别不了。
    akmonde
        37
    akmonde  
    OP
       2019-04-30 11:47:32 +08:00
    @tt0411 求指点,我迁移后没法用管理器,老板要求即使没有 docker 之类的,也是解压就能用。原生能支持么?
    akmonde
        38
    akmonde  
    OP
       2019-04-30 11:53:50 +08:00
    @izoabr 是,所以我想用借助三方软件打包的,但领导意思是新机器可能啥都没有,也没有管理软件,要求能解压完直接用,我不知道原生的怎么做到。
    @izoabr 是啊,他要求依赖全拿进去,不管啥系统都能适配,连着 python 本身一起打包,说新机器可能没有 python。
    chaleaochexist
        39
    chaleaochexist  
       2019-04-30 11:57:54 +08:00
    docker...
    akmonde
        40
    akmonde  
    OP
       2019-04-30 16:52:10 +08:00
    @miaoever 给赞,很好的东西,但是我那儿环境比较复杂,里面还加了 celery 之类的,不是很适合。
    wangfengmadking
        41
    wangfengmadking  
       2019-04-30 17:17:02 +08:00
    1. 假设所有机器已经有 setup 环境了,那么你直接写一个 setup.py, 所有第三方依赖的源码都放在你项目的子目录里面,这样运行 setpu.py 就可以了;或者你预先编译 whl 文件
    2. 如果机器连 setup tools 都没有,那么你还是把你的代码根据平台直接编译成二进制文件;
    tt0411
        42
    tt0411  
       2019-04-30 22:27:38 +08:00
    @akmonde 前提部署环境都是 Linux 内核且版本不太低, 剩下的就是堆 lib 和 bin 了, 整个过程本质是把操作系统发行版做的一些事情自己再做一遍, 如果对编译链接有一定理解的话, 难度并没有想象的那么大. 之所以很多人觉得很困难, 可能是现在流行的编程语言把很多有趣的东西封装起来了.
    necomancer
        43
    necomancer  
       2019-05-07 03:13:11 +08:00
    直接 miniconda 行不行?实在不行连整个 py 环境都给他……
    akmonde
        44
    akmonde  
    OP
       2019-05-07 08:24:49 +08:00
    @necomancer 他那边就不让用第三方管理器,说是怕断网的纯净环境呢。
    akmonde
        45
    akmonde  
    OP
       2019-05-07 08:26:59 +08:00
    @wangfengmadking 非常感谢,我研究下。另外,他那边的意思我得自带 python 环境打包,调相对路径。主要是 whl 也需要系统依赖吧。
    akmonde
        46
    akmonde  
    OP
       2019-05-07 08:28:30 +08:00
    @tt0411 是,确实难点在这儿,我看了下安装过程中的一些坑,让我去 yum 或者 apt-get 一些包,关键点在于,我无法定位我这报错,到底是缺了什么 lib 和 bin,这是最蛋疼的,所以让我单独去编译链接坑点还是比较多。
    akmonde
        47
    akmonde  
    OP
       2019-05-07 08:30:16 +08:00
    @xiaoheijw 想着做适配主流,判断下,根据不同的系统去装不同的包,不过领导估计不一定认可,他要求在纯净断网环境也能用上。
    necomancer
        48
    necomancer  
       2019-05-07 15:05:13 +08:00
    @akmonde 我是想说你自己用 miniconda 搞一个,连整个 conda 的 python 环境一起给他,只有自己的项目调用那个 python....保证通用。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1220 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 23:51 PVG 07:51 LAX 15:51 JFK 18:51
    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