我现在有这样一个场景,内网不能连接互联网,需要部署一套基于 selenium 的自动化系统,不能用 pip 从网上下包,也不允许用 docker 做镜像导入,只能用安装包一个个安装部署,最多自己写写脚本自动安装。
我可以在外网弄一个虚拟机,安装一模一样的操作系统,试验部署直至整个系统稳定运行,然后把所有依赖打包至内网,然后手动或者用脚本重复整个过程。
这个部署过程还得分别在 Debian 9 和 Windows 7 上面部署两套,我准备弄 Debian 9 和 Win 7 两套虚拟机分别做,都只能单机条件下,而且不能自己内网弄个服务器建一个本地源存放所有包,有什么比较好的解决方案。最好是能自动化脚本,机器数量还比较多。
目前看了一下,本地包管理的话使用 pip 和 pyinstaller,Python 环境管理有 pyenv,pipenv 还是 virtualenv,已知的问题是 pyenv 必须使用 pyenv 管理的 python 版本,其他还有什么坑?麻烦各位支个招,有踩坑过的也来分享一下。
1
RRRoger 2021-05-19 16:02:10 +08:00 2
使用 conda pack 打包 用 miniconda 作为虚拟环境
|
2
abersheeran 2021-05-19 16:03:27 +08:00 1
恰好我也有这样的需求。推荐使用 pdm 解决。
|
3
noqwerty 2021-05-19 16:04:27 +08:00 via Android 1
conda 或者 poetry 吧
|
4
frostming 2021-05-19 16:08:33 +08:00 2
PDM 可以把依赖装到__pypackages__里,直接打包带走,在目标机器上只要 PYTHONPATH=path/to/__pypackages__/3.8/lib 即可
可以参考 https://pdm.fming.dev/usage/advanced/#use-pdm-in-a-multi-stage-dockerfile 打包还可以用 zipapp 或者 shiv 这种 |
5
abersheeran 2021-05-19 16:09:51 +08:00
补充楼上,这是我添加的两个环境变量。
```dockerfile .................. ENV PATH="/app/__pypackages__/3.9/bin:$PATH" ENV PYTHONPATH="/app/__pypackages__/3.9/lib:$PYTHONPATH" WORKDIR /app ......................... ``` |
6
jianjian001 2021-05-19 16:10:47 +08:00 2
pyenv 管理版本
poetry 管理依赖 |
7
shayuvpn0001 OP |
8
zeroDev 2021-05-19 16:23:54 +08:00 via Android
如果你习惯命令行界面
pipenv,反正自带的那个就行 如果习惯 GUI,那不清楚了 |
9
ctro15547 2021-05-19 16:25:19 +08:00
conda 太爽了。。。
|
10
Jirajine 2021-05-19 16:29:24 +08:00
poetry or pyflow
|
11
paopjian 2021-05-19 16:32:06 +08:00
zip 打包 conda 环境,但是有些包必须要用 pip 重装一遍,只好附带 whl 了
|
12
frostming 2021-05-19 16:34:18 +08:00 1
@shayuvpn0001 不是让用 Docker,是提供借鉴,这里 build 和 run 两个 stage 刚好对应你外网和内网的机器
|
13
zone10 2021-05-19 16:47:13 +08:00 1
用 virtualenv, 把依赖下在 venv 目录里整个复制过去就行. 是不允许用 docker 还是不允许拉 docker 镜像, 如果是后者可以把 docker 镜像导出为压缩包再去内网安装, win7 能用 docker, 有个工具叫 DockerToolBox, 如果是 win10 能用 Hyper-V 就更方便了, Docker Desktop 了解一下
|
14
terencehan 2021-05-19 18:48:41 +08:00
一直在用 miniconda
|
15
z740713651 2021-05-19 18:52:16 +08:00
miniconda +1
|
16
yzc27 2021-05-19 18:58:26 +08:00 via iPhone
poetry
|
17
youngce 2021-05-19 19:01:23 +08:00
回归 virtualenv,方便生产纯净的依赖文件
|
18
SenLief 2021-05-19 20:13:31 +08:00
python 不是自带个虚拟环境吗? python -m venv .venv 这个和上面的有啥差别吗?
|
19
cmdOptionKana 2021-05-19 21:40:21 +08:00 1
还是觉得 miniconda 的逻辑最清晰
|
20
among 2021-05-19 22:18:44 +08:00
|
21
clino 2021-05-19 22:20:09 +08:00 1
我一般用 virtualenv+pyenv
|
22
wongskay 2021-05-19 23:01:38 +08:00 via iPhone 1
anaconda
|
23
ClericPy 2021-05-19 23:28:03 +08:00 1
最近同样部署 chrome 自动化工具, 用的自己写的 zipapps, 如果不嫌麻烦可以继续看, 我这边是 Jenkins 打包机 Linux 打包以后在 Hadoop 那边直接执行的
看你情景必须把依赖和源代码打包起来一起发布, 可以尝试一下. 有几个前提: 1. Python3.7+ 2. Windows 打包的只能 Windows 用, Linux 打包的只能 Linux 用, 有些库不是跨平台的要编译, 打包机 Python 版本也得和运行环境一致, 类似 selectolax 或者 psutil 这样有 .so 的就没法同时给 3.7 3.8 一起用 3. 执行的时候估计会解压出一个文件夹在旁边 步骤: 1. 打包机上安装 python3.7 -m pip install zipapps -U --user 2. python3.7 -m zipapps -c -a path_to_your_package -m package_name.__main__:main -o app.pyz -u="*" -r requirement.txt 3. 客户端那边运行 python3.7 app.pyz 打包以后文件挺大的, 毕竟带了所有依赖, 如果想依赖和代码分开打包也可以, 也可以不指定 entry_point (也就是那个-m 参数), 打包后当虚拟环境使 |
24
shayuvpn0001 OP @frostming 你是 PDM 作者?哈哈,厉害。
另外,PDM 依赖 python 3.7 以上,我刚好有个包最高只能用到 3.6,可以先装 Python 3.7,然后 PDM,再用版本管理工具弄个 Python 3.6,再用 PDM 弄我的项目么?思路是 PDM 泡在 3.7 上,我自己的跑在 3.6 上。 然后给你文档挑个书写错误:Use PDM in Continuous Integration# 这一部分里面,Here is an example worflow of GitHub 应该是 workflow |
25
xiebinbin666 2021-05-20 17:09:06 +08:00
|
26
frostming 2021-05-28 15:18:18 +08:00
@shayuvpn0001 可以,PDM 就是这样工作的
|