搜索了一上午,还是不知道如何实现这一需求,场景是两台相同的服务器,在一台上安装了 python3 ,创建了虚拟环境,现在想把这个环境打成 tar.gz 包,复制到另外一台没装 python3 的服务器上解压运行
1
xwwsxp 268 天前 4
Docker 不就行了
|
2
gcc1117 268 天前
同好奇,详细怎么操作。看到网上共享的那些一键启动的工具应该就是把 python 执行文件还有 venv 的库文件都放在一起就可以了,但自己没有试过不知道有没有什么坑。
|
3
foolishcrab 268 天前 via iPhone
Docker 不就行了
|
4
bao3 268 天前
这种情况用 docker container 或者 lxc /jail 之类的是最方便的
|
5
FlytoSirius 268 天前
你提的这个场景, 本就不应该在这个层面去实现.
应该由下层的 " VM 或 容器" 去实现应用依赖环境管理和灵活部署. |
6
liuhuansir OP @gcc1117 我司有个产品就是这种发布形式,是其他组的产品,我问了一些人,没问到实现方式
|
7
nyfwan123 268 天前
poetry
|
8
dongtq 268 天前 1
conda?
|
9
longbow0 268 天前
conda 提供了具体的方法
|
11
liuhuansir OP @longbow0 谢谢,我试试看
|
12
idontnowhat2say 268 天前
以下没有完全求证,个人猜测。
如果另一台装了 相同版本的 Python ,直接把 venv 目录拷贝过去应该就能运行了,前提是没有 pip 包依赖什么没有预装的 C 动态 so 文件。 如果另外一台没有装 Python ,可以试试看 https://github.com/marcelotduarte/cx_Freeze 这个可以把整个 Python 打包成可执行文件。 |
13
lizytalk 268 天前
docker
|
14
edwinyzhang 268 天前
container
|
15
1018ji 268 天前
路径需要相同,不然就完犊子
|
16
mMartin 268 天前
conda +1
|
17
dif 268 天前
conda pack
|
18
pollux 268 天前
zipapp +1
|
19
mumbler 268 天前
我们用的方法是把服务器做 ghost 镜像,到另一台恢复
|
20
Tink 268 天前
docker
|
21
dianso 268 天前
docker
|
22
lizhiping886 268 天前
windows 的话用 python embeddable package 版本
|
23
zengxs 268 天前
你者说的不就是容器,docker 打好镜像,docker save 就能导出成 tar.gz 了
|
24
20015jjw 268 天前
pipx?
|
25
liuhuansir OP @zengxs docker 的方式大家都知道,我的需求是在一台新的服务器上直接跑
|
26
liuhuansir OP @longbow0 这种方式我下午试过了,按文档里的说法应该是可以的,但是我执行起来还是报错,看报错信息,里面有些模块会去/usr/local/python3 下找,新服务器没装 python
|
27
ClericPy 267 天前
如果没有很特殊的库, 用 https://pypi.org/project/zipapps/ 就够了吧.
如果两头 python 版本和环境一样的, 不用开 -d 模式提前安装好依赖, 如果有 c 依赖 记得 -u=AUTO 或 -u=* 把依赖和代码打包到一块, 可以带 entrypoint / shebang 直接运行, 也可以当个 venv |
28
ClericPy 267 天前
呃, 没装 python 就装个 python?
https://github.com/indygreg/python-build-standalone/releases 一大堆绿色版 python 如果想打二进制可执行文件, nuitka 就行了, 不会 nuitka 可以直接用 GUI 生成 https://github.com/ClericPy/nuitka_simple_gui |
29
liuhuansir OP 厚着脸皮通过研发总监找到了公司制作这个包的开发,他给了文档,感觉有点复杂,需要手动修改 bin 目录下的可执行文件,把依赖的 so 复制进去,手动处理所有的软连接
|
31
longbow0 267 天前
@liuhuansir 在创建 conda 环境的时候,指定安装 python 看看:conda create -n myenv python=3 pip ,这样就会在这个环境下安装需要版本的 python
|
32
Frankcox 267 天前
手动装好 python+venv 环境+ bat 脚本,我前一段时间写了一个程序给公司其他同事,因为一些安全问题只能在个人电脑上跑,我就直接这么给人家的
|
33
duanzhanling 267 天前
docker
|
34
lovelylain 267 天前 via Android
另一台服务器上相同路径解压后,要先 source activate 激活环境,才能
|
35
xchaoinfo 267 天前
这个方案我搞过,miniconda 安装后,/path/python -m pip install 安装需要的包,然后直接复制到另外机器的相同路径,然后直接 /path/python xx.py 执行就可以了。期间不要添加任何环境变量啥的
|
36
yulgang 267 天前
如果另一台什么都不想装,那就 chroot 方式 ?
|
37
djasdjds 267 天前
python3-virtualenv
|
38
beyondstars 267 天前
把整块硬盘拆下来带过去。
|
39
jiejiss 267 天前
直接打包成 rootfs ,在另一台机器上 systemd-nspawn
|
40
zuiyue123 267 天前
所有环境都安装在虚拟环境,把整个虚拟环境打包拷贝过去,在新环境里面直接执行就可以的
|
41
realJamespond 267 天前
pyinstaller
|
42
kwater 267 天前
内存够就纯虚拟机,这个灵活
资源紧张就 docker ,让开发整理出包依赖 requirement.txt 。 任何情况都不要污染自己的 native 环境 ,直接跑都是危险且对部署没价值的。 |
43
zizon 267 天前
venv 理论上应该依赖都在里面,如 34L 说的直接拷贝过去 activate 就行.
剩下的可能就是你自己说的一些 py 库可能依赖了某些 so,这个就只能运行时跑起来慢慢补了才知道? |
44
ZnductR0MjHvjRQ3 267 天前
好的解决方案还是使用 docker 这也是容器的优势
|
45
liuhuansir OP 今天下午参照我司开发给的文档,自己在 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 的任意目录,解压之后激活虚拟环境即可 |
46
liuhuansir OP @Motorola3 确实是的,所以网上这方面的信息太少,docker 方便又简单,还不会出现兼容性问题
|
47
tangtang369 267 天前
@liuhuansir #45 如果两个硬件环境是一模一样的 直接硬盘对拷
|
48
tooroot 267 天前
如果操作系统环境是一样的,pyenv 也行,前提是系统已经包含了运行 python 的必要库,不行就打包成二进制运行
|
49
laminux29 267 天前 1
docker 的方式大家都知道??
不,我认为你并不知道。 我的需求是在一台新的服务器上直接跑?? 你的需求为啥不是意念控制服务器直接跑? Python + pip 早已是各种 Linux 主流发行版的一部分,这玩意是万万不能改动的,就算增加一个新环境也不行,因为这也算是更改,迟早要出问题。 如果需要跑别的版本的 Python ,用 docker 才是正解,因为这就是 docker 要处理的问题,你就把宿主 host 当成不可变设施的一部分,当成纯算力的一部分,别理会它就行。 |
50
iX8NEGGn 267 天前
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 |
51
liuhuansir OP @laminux29 呵呵
|
52
daytonight 266 天前
pyenv 应该可以,Python 环境和依赖都在独立的目录下,整个复制到目的机器上应该可行。
|
53
wyxll 266 天前
requirements.txt
conda docker |
54
Haku 266 天前
我好像做过,不过 Python 本身还是需要重新安装的。
直接提供包括 python 在内的所有的安装包,依赖通过 whl 带过去一起装。 |
55
Haku 266 天前
@Haku python 本身安装应该你会,在原本环境生成 requirements 后,用 pip download 的方式可以下载的对应的 whl 包,然后直接挪过去现场安装就可以了。
|
56
cdlnls 258 天前
其实这种场景,排除 docker 的话,在官网下载 embed 版本的 python 应该是个比较合适的方案。所有的 python 运行环境需要的资源都在一个目录下,如果需要把程序放在其他机器上运行,直接打包然后复制过去就能运行,不需要整什么虚拟环境。
|
57
usiantein 257 天前
楼主好,这种需求我之前也遇到过,说下我的经验。
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 的体积还是比较小的,使用起来很轻便。 |