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

2024-02-21 13:07:19 +08:00
 liuhuansir

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

6197 次点击
所在节点    Python
57 条回复
realJamespond
2024-02-22 13:35:07 +08:00
pyinstaller
kwater
2024-02-22 13:57:23 +08:00
内存够就纯虚拟机,这个灵活

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

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

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

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

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

conda

docker
Haku
2024-02-23 15:21:46 +08:00
我好像做过,不过 Python 本身还是需要重新安装的。
直接提供包括 python 在内的所有的安装包,依赖通过 whl 带过去一起装。
Haku
2024-02-23 15:26:29 +08:00
@Haku python 本身安装应该你会,在原本环境生成 requirements 后,用 pip download 的方式可以下载的对应的 whl 包,然后直接挪过去现场安装就可以了。
cctv6
2024-03-02 15:56:20 +08:00
其实这种场景,排除 docker 的话,在官网下载 embed 版本的 python 应该是个比较合适的方案。所有的 python 运行环境需要的资源都在一个目录下,如果需要把程序放在其他机器上运行,直接打包然后复制过去就能运行,不需要整什么虚拟环境。
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 的体积还是比较小的,使用起来很轻便。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1017166

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX