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

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

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

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

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

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

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

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

    任何情况都不要污染自己的 native 环境 ,直接跑都是危险且对部署没价值的。
    zizon
        43
    zizon  
       273 天前
    venv 理论上应该依赖都在里面,如 34L 说的直接拷贝过去 activate 就行.
    剩下的可能就是你自己说的一些 py 库可能依赖了某些 so,这个就只能运行时跑起来慢慢补了才知道?
    ZnductR0MjHvjRQ3
        44
    ZnductR0MjHvjRQ3  
       273 天前
    好的解决方案还是使用 docker 这也是容器的优势
    liuhuansir
        45
    liuhuansir  
    OP
       273 天前
    今天下午参照我司开发给的文档,自己在 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
       273 天前
    @Motorola3 确实是的,所以网上这方面的信息太少,docker 方便又简单,还不会出现兼容性问题
    tangtang369
        47
    tangtang369  
       273 天前
    @liuhuansir #45 如果两个硬件环境是一模一样的 直接硬盘对拷
    tooroot
        48
    tooroot  
       273 天前
    如果操作系统环境是一样的,pyenv 也行,前提是系统已经包含了运行 python 的必要库,不行就打包成二进制运行
    laminux29
        49
    laminux29  
       273 天前   ❤️ 1
    docker 的方式大家都知道??
    不,我认为你并不知道。

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

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

    如果需要跑别的版本的 Python ,用 docker 才是正解,因为这就是 docker 要处理的问题,你就把宿主 host 当成不可变设施的一部分,当成纯算力的一部分,别理会它就行。
    iX8NEGGn
        50
    iX8NEGGn  
       273 天前
    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
       273 天前
    @laminux29 呵呵
    daytonight
        52
    daytonight  
       273 天前
    pyenv 应该可以,Python 环境和依赖都在独立的目录下,整个复制到目的机器上应该可行。
    wyxll
        53
    wyxll  
       272 天前
    requirements.txt

    conda

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

    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   ·   实用小工具   ·   1797 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:29 · PVG 00:29 · LAX 08:29 · JFK 11:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.