怎么实现把虚拟环境打包,然后在另一台服务器上解压后即可运行 - 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
liuhuansir
V2EX    Python

怎么实现把虚拟环境打包,然后在另一台服务器上解压后即可运行

  •  
  •   liuhuansir 2024-02-21 13:07:19 +08:00 6091 次点击
    这是一个创建于 603 天前的主题,其中的信息可能已经有所发展或是发生改变。

    搜索了一上午,还是不知道如何实现这一需求,场景是两台相同的服务器,在一台上安装了 python3 ,创建了虚拟环境,现在想把这个环境打成 tar.gz 包,复制到另外一台没装 python3 的服务器上解压运行

    57 条回复    2024-03-03 11:40:27 +08:00
    xwwsxp
        1
    xwwsxp  
       2024-02-21 13:11:50 +08:00   4
    Docker 不就行了
    gcc1117
        2
    gcc1117  
       2024-02-21 13:12:57 +08:00
    同好奇,详细怎么操作。看到网上共享的那些一键启动的工具应该就是把 python 执行文件还有 venv 的库文件都放在一起就可以了,但自己没有试过不知道有没有什么坑。
    foolishcrab
        3
    foolishcrab  
       2024-02-21 13:14:13 +08:00 via iPhone
    Docker 不就行了
    bao3
        4
    bao3  
       2024-02-21 13:14:46 +08:00
    这种情况用 docker container 或者 lxc /jail 之类的是最方便的
    FlytoSirius
        5
    FlytoSirius  
       2024-02-21 13:16:43 +08:00
    你提的这个场景, 本就不应该在这个层面去实现.
    应该由下层的 " VM 或 容器" 去实现应用依赖环境管理和灵活部署.
    liuhuansir
        6
    liuhuansir  
    OP
       2024-02-21 13:22:26 +08:00
    @gcc1117 我司有个产品就是这种发布形式,是其他组的产品,我问了一些人,没问到实现方式
    nyfwan123
        7
    nyfwan123  
       2024-02-21 13:27:23 +08:00
    poetry
    dongtq
        8
    dongtq  
       2024-02-21 13:35:05 +08:00   1
    conda?
    longbow0
        9
    longbow0  
       2024-02-21 13:36:03 +08:00
    conda 提供了具体的方法
    longbow0
        10
    longbow0  
       2024-02-21 13:36:09 +08:00   2
    liuhuansir
        11
    liuhuansir  
    OP
       2024-02-21 13:39:13 +08:00
    @longbow0 谢谢,我试试看
    idontnowhat2say
        12
    idontnowhat2say  
       2024-02-21 13:41:42 +08:00
    以下没有完全求证,个人猜测。

    如果另一台装了 相同版本的 Python ,直接把 venv 目录拷贝过去应该就能运行了,前提是没有 pip 包依赖什么没有预装的 C 动态 so 文件。

    如果另外一台没有装 Python ,可以试试看 https://github.com/marcelotduarte/cx_Freeze 这个可以把整个 Python 打包成可执行文件。
    lizytalk
        13
    lizytalk  
       2024-02-21 13:54:13 +08:00
    docker
    edwinyzhang
        14
    edwinyzhang  
       2024-02-21 14:01:27 +08:00
    container
    1018ji
        15
    1018ji  
       2024-02-21 14:05:11 +08:00
    路径需要相同,不然就完犊子
    mMartin
        16
    mMartin  
       2024-02-21 15:42:28 +08:00
    conda +1
    dif
        17
    dif  
       2024-02-21 16:35:07 +08:00
    conda pack
    pollux
        18
    pollux  
       2024-02-21 17:18:40 +08:00
    zipapp +1
    mumbler
        19
    mumbler  
       2024-02-21 17:27:12 +08:00
    我们用的方法是把服务器做 ghost 镜像,到另一台恢复
    Tink
        20
    Tink  
    PRO
       2024-02-21 17:37:23 +08:00
    docker
    dianso
        21
    dianso  
       2024-02-21 17:48:18 +08:00
    docker
    lizhiping886
        22
    lizhiping886  
       2024-02-21 17:52:24 +08:00
    windows 的话用 python embeddable package 版本
    zengxs
        23
    zengxs  
       2024-02-21 18:32:12 +08:00
    你者说的不就是容器,docker 打好镜像,docker save 就能导出成 tar.gz 了
    20015jjw
        24
    20015jjw  
       2024-02-21 18:38:39 +08:00
    pipx?
    liuhuansir
        25
    liuhuansir  
    OP
       2024-02-21 18:53:00 +08:00
    @zengxs docker 的方式大家都知道,我的需求是在一台新的服务器上直接跑
    liuhuansir
        26
    liuhuansir  
    OP
       2024-02-21 18:55:26 +08:00
    @longbow0 这种方式我下午试过了,按文档里的说法应该是可以的,但是我执行起来还是报错,看报错信息,里面有些模块会去/usr/local/python3 下找,新服务器没装 python
    ClericPy
        27
    ClericPy  
       2024-02-21 19:00:14 +08:00
    如果没有很特殊的库, 用 https://pypi.org/project/zipapps/ 就够了吧.

    如果两头 python 版本和环境一样的, 不用开 -d 模式提前安装好依赖, 如果有 c 依赖 记得 -u=AUTO 或 -u=*

    把依赖和代码打包到一块, 可以带 entrypoint / shebang 直接运行, 也可以当个 venv
    ClericPy
        28
    ClericPy  
       2024-02-21 19:02:08 +08:00
    呃, 没装 python 就装个 python?

    https://github.com/indygreg/python-build-standalone/releases 一大堆绿色版 python

    如果想打二进制可执行文件, nuitka 就行了, 不会 nuitka 可以直接用 GUI 生成 https://github.com/ClericPy/nuitka_simple_gui
    liuhuansir
        29
    liuhuansir  
    OP
       2024-02-21 19:02:35 +08:00
    厚着脸皮通过研发总监找到了公司制作这个包的开发,他给了文档,感觉有点复杂,需要手动修改 bin 目录下的可执行文件,把依赖的 so 复制进去,手动处理所有的软连接
    YaakovZiv
        30
    YaakovZiv  
       2024-02-21 20:17:34 +08:00
    @gcc1117 坑之一是,调用资源必须全绝对路径,因为相对路径会把系统环境自带的文件调用,系统环境如果不是预想环境,会在运行时出现各种奇怪问题。
    longbow0
        31
    longbow0  
       2024-02-21 20:21:00 +08:00
    @liuhuansir 在创建 conda 环境的时候,指定安装 python 看看:conda create -n myenv python=3 pip ,这样就会在这个环境下安装需要版本的 python
    Frankcox
        32
    Frankcox  
       2024-02-21 21:01:16 +08:00
    手动装好 python+venv 环境+ bat 脚本,我前一段时间写了一个程序给公司其他同事,因为一些安全问题只能在个人电脑上跑,我就直接这么给人家的
    duanzhanling
        33
    duanzhanling  
       2024-02-22 07:24:56 +08:00
    docker
    lovelylain
        34
    lovelylain  
       2024-02-22 08:21:39 +08:00 via Android
    另一台服务器上相同路径解压后,要先 source activate 激活环境,才能
    xchaoinfo
        35
    xchaoinfo  
       2024-02-22 09:15:10 +08:00
    这个方案我搞过,miniconda 安装后,/path/python -m pip install 安装需要的包,然后直接复制到另外机器的相同路径,然后直接 /path/python xx.py 执行就可以了。期间不要添加任何环境变量啥的
    yulgang
        36
    yulgang  
       2024-02-22 09:43:52 +08:00
    如果另一台什么都不想装,那就 chroot 方式 ?
    lzZzeucJri6FcR0o
        37
    lzZzeucJri6FcR0o  
       2024-02-22 10:04:08 +08:00
    python3-virtualenv
    beyondstars
        38
    beyondstars  
       2024-02-22 10:32:49 +08:00
    把整块硬盘拆下来带过去。
    jiejiss
        39
    jiejiss  
       2024-02-22 11:11:31 +08:00
    直接打包成 rootfs ,在另一台机器上 systemd-nspawn
    zuiyue123
        40
    zuiyue123  
       2024-02-22 11:14:46 +08:00
    所有环境都安装在虚拟环境,把整个虚拟环境打包拷贝过去,在新环境里面直接执行就可以的
    realJamespond
        41
    realJamespond  
       2024-02-22 13:35:07 +08:00
    pyinstaller
    kwater
        42
    kwater  
       2024-02-22 13:57:23 +08:00
    内存够就纯虚拟机,这个灵活

    资源紧张就 docker ,让开发整理出包依赖 requirement.txt 。

    任何情况都不要污染自己的 native 环境 ,直接跑都是危险且对部署没价值的。
    zizon
        43
    zizon  
       2024-02-22 14:34:34 +08:00
    venv 理论上应该依赖都在里面,如 34L 说的直接拷贝过去 activate 就行.
    剩下的可能就是你自己说的一些 py 库可能依赖了某些 so,这个就只能运行时跑起来慢慢补了才知道?
    ZnductR0MjHvjRQ3
        44
    ZnductR0MjHvjRQ3  
       2024-02-22 15:48:12 +08:00
    好的解决方案还是使用 docker 这也是容器的优势
    liuhuansir
        45
    liuhuansir  
    OP
       2024-02-22 15:49:01 +08:00
    今天下午参照我司开发给的文档,自己在 centos7.6 上试验了一次,基本上实现了解压运行,下面是简单的实现步骤:
    两台相同系统的服务器 A 和 B ,以 python3.6.9 为例,其他类似
    1 、A 上源码编译安装 python3.6.9 到/usr/local/python36
    2 、python3 -m venv venv --copies 创建虚拟环境,--copies 参数不使用软连接方式
    3 、复制/user/local/python36/include 目录到 venv 下
    4 、复制/user/local/python36/lib 下的 libpython3.6m.a 文件和 pkgconfig 目录
    5 、复制/user/local/python36/lib 下的 python3.6 目录,注意不要复制里面的 site-packages
    6 、修改/user/local/python36/bin 目录下可执行的 python 脚本,首行改成#!/usr/bin/env python
    7 、修改/user/local/python36/bin 目录下的 activate ,设置 PYTHONHOME 和 LD_LIBRARY_PATH 环境变量
    最后打成压缩包复制到 B 的任意目录,解压之后激活虚拟环境即可
    liuhuansir
        46
    liuhuansir  
    OP
       2024-02-22 15:51:20 +08:00
    @Motorola3 确实是的,所以网上这方面的信息太少,docker 方便又简单,还不会出现兼容性问题
    tangtang369
        47
    tangtang369  
       2024-02-22 16:43:09 +08:00
    @liuhuansir #45 如果两个硬件环境是一模一样的 直接硬盘对拷
    tooroot
        48
    tooroot  
       2024-02-22 16:51:14 +08:00
    如果操作系统环境是一样的,pyenv 也行,前提是系统已经包含了运行 python 的必要库,不行就打包成二进制运行
    laminux29
        49
    laminux29  
       2024-02-22 17:31:27 +08:00   1
    docker 的方式大家都知道??
    不,我认为你并不知道。

    我的需求是在一台新的服务器上直接跑??
    你的需求为啥不是意念控制服务器直接跑?

    Python + pip 早已是各种 Linux 主流发行版的一部分,这玩意是万万不能改动的,就算增加一个新环境也不行,因为这也算是更改,迟早要出问题。

    如果需要跑别的版本的 Python ,用 docker 才是正解,因为这就是 docker 要处理的问题,你就把宿主 host 当成不可变设施的一部分,当成纯算力的一部分,别理会它就行。
    iX8NEGGn
        50
    iX8NEGGn  
       2024-02-22 18:08:25 +08:00
    venv 是不可移动的,因为链接使用的是绝对地址。

    之前的可以使用 --relocatable 参数重新链接,现在已经被废弃了。

    只能曲线救国:

    1. 把当前依赖信息导出
    pip freeze > requirements.txt

    2. 把当前依赖导出,并复制到别的电脑
    pip download -r requestments.txt -d ./pip_freeze

    3. 别的电脑上执行还原
    pip install --no-index --find-links=d:\pip_freeze -r requirements.txt
    liuhuansir
        51
    liuhuansir  
    OP
       2024-02-22 18:36:35 +08:00
    @laminux29 呵呵
    daytonight
        52
    daytonight  
       2024-02-22 22:53:52 +08:00
    pyenv 应该可以,Python 环境和依赖都在独立的目录下,整个复制到目的机器上应该可行。
    wyxll
        53
    wyxll  
       2024-02-23 11:15:29 +08:00
    requirements.txt

    conda

    docker
    Haku
        54
    Haku  
       2024-02-23 15:21:46 +08:00
    我好像做过,不过 Python 本身还是需要重新安装的。
    直接提供包括 python 在内的所有的安装包,依赖通过 whl 带过去一起装。
    Haku
        55
    Haku  
       2024-02-23 15:26:29 +08:00
    @Haku python 本身安装应该你会,在原本环境生成 requirements 后,用 pip download 的方式可以下载的对应的 whl 包,然后直接挪过去现场安装就可以了。
    cctv6
        56
    cctv6  
       2024-03-02 15:56:20 +08:00
    其实这种场景,排除 docker 的话,在官网下载 embed 版本的 python 应该是个比较合适的方案。所有的 python 运行环境需要的资源都在一个目录下,如果需要把程序放在其他机器上运行,直接打包然后复制过去就能运行,不需要整什么虚拟环境。
    usiantein
        57
    usiantein  
       2024-03-03 11:40:27 +08:00
    楼主好,这种需求我之前也遇到过,说下我的经验。

    1. 使用 miniconda 还是很简单的
    在 A 机器上安装 miniconda ,例如安装路径为 ~/miniconda3 ,通过 source ~/miniconda3/bin/activate 来激活虚拟环境,所有安装的第三方包,都在 ~/miniconda3/lib/python3.11/site-packages 目录下(如果你的 python 版本是 3.11 ),这时候只需要将 ~/miniconda3 整体打包,然后在 B 机器相同的路径下解压(很重要),也就是解压缩到 B 机器的 home 下,再在 B 上 source 命令激活虚拟环境就行,就可以直接用了,之前所有装过的第三方包都无需重装。非常简便。

    2. 使用 docker
    这种估计大家都能想得到。

    ps: 还是建议使用 miniconda 来管理 python 和虚拟环境,首先源码安装 python 还是太繁琐了,其次,anaconda 的基础版本体积太大了,且比较适合科学计算,miniconda3 的体积还是比较小的,使用起来很轻便。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5269 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:18 PVG 15:18 LAX 00:18 JFK 03:18
    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