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 · 6732 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 他的意思是机器可能啥都没装,临时用没时间装,要求直接解压安装就能用。
    tomczhen
        3
    tomczhen  
       2019-04-29 23:42:26 +08:00
    完全是张口就来——虽然我不知道该怎么做,但是这个问题肯定很简单,简单抽空做一下,明天就要。

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

    用 pyinstaller 之类的工具能解决 一部分问题,不过也不是短时间马上就能搞定全系统 Linux 适配。
    shuax
        4
    shuax  
       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
    sagaxu  
       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   ·   实用小工具   ·   5493 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:47 · PVG 14:47 · LAX 22:47 · JFK 01:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.