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