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

    搜索了一上午,还是不知道如何实现这一需求,场景是两台相同的服务器,在一台上安装了 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  
       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 包,然后直接挪过去现场安装就可以了。
    cdlnls
        56
    cdlnls  
       361 天前
    其实这种场景,排除 docker 的话,在官网下载 embed 版本的 python 应该是个比较合适的方案。所有的 python 运行环境需要的资源都在一个目录下,如果需要把程序放在其他机器上运行,直接打包然后复制过去就能运行,不需要整什么虚拟环境。
    usiantein
        57
    usiantein  
       360 天前
    楼主好,这种需求我之前也遇到过,说下我的经验。

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