技术解析

Python 环境管理用那一套比较好: pyenv, pipenv 还是 virtualen
0
2021-06-01 11:28:17
idczone

我现在有这样一个场景,内网不能连接互联网,需要部署一套基于 selenium 的自动化系统,不能用 pip 从网上下包,也不允许用 docker 做镜像导入,只能用安装包一个个安装部署,最多自己写写脚本自动安装。

我可以在外网弄一个虚拟机,安装一模一样的操作系统,试验部署直至整个系统稳定运行,然后把所有依赖打包至内网,然后手动或者用脚本重复整个过程。

这个部署过程还得分别在 Debian 9 和 Windows 7 上面部署两套,我准备弄 Debian 9 和 Win 7 两套虚拟机分别做,都只能单机条件下,而且不能自己内网弄个服务器建一个本地美国服务器源存放所有包,有什么比较好的解决方案。最好是能自动化脚本,机器数量还比较多。

目前看了一下,本地包管理的话使用 pip 和 pyinstaller,Python 环境管理有 pyenv,pipenv 还是 virtualenv,已知的问题是 pyenv 必须使用 pyenv 管理的 python 版本,其他还有什么坑?麻烦各位支个招,有踩坑过的也来分享一下。


使用 conda pack 打包 用 miniconda 作为虚拟环境

恰好我也有这样的需求。推荐使用 pdm 解决。

conda 或者 poetry 吧

PDM 可以把依赖装到__pypackages__里,直接打包带走,在目标机器上只要 PYTHONPATH=path/to/__pypackages__/3.8/lib 即可
可以参考 https://pdm.fming.dev/usage/advanced/zipapp 或者 shiv 这种

补充楼上,这是我添加的两个环境变量。
```dockerfile
..................
ENV PATH="/app/__pypackages__/3.9/bin:$PATH"
ENV PYTHONPATH="/app/__pypackages__/3.9/lib:$PYTHONPATH"
WORKDIR /app
.........................
```

pyenv 管理版本
poetry 管理依赖



Win 7 系统下面没办法用 Docker 吧

如果你习惯命令行界面
pipenv,反正自带的那个就行
如果习惯 GUI,那不清楚了

conda 太爽了。。。

poetry or pyflow

zip 打包 conda 环境,但是有些包必须要用 pip 重装一遍,只好附带 whl 了

不是让用 Docker,是提供借鉴,这里 build 和 run 两个 stage 刚好对应你外网和内网的机器

用 virtualenv, 把依赖下在 venv 目录里整个复制过去就行. 是不允许用 docker 还是不允许拉 docker 镜像, 如果是后者可以把 docker 镜像导出为压缩包再去内网安装, win7 能用 docker, 有个工具叫 DockerToolBox, 如果是 win10 能用 Hyper-V 就更方便了, Docker Desktop 了解一下

一直在用 miniconda

miniconda +1

poetry

回归 virtualenv,方便生产纯净的依赖文件

python 不是自带个虚拟环境吗? python -m venv .venv 这个和上面的有啥差别吗?

还是觉得 miniconda 的逻辑最清晰

顺便问下,用 conda pack 打包的东西包括 py 的基础环境么。
如果是 centos7 下大打包的 py3.6, 在 centos 8 中 使用,是否会有问题。

我一般用 virtualenv+pyenv

anaconda

最近同样部署 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 参数), 打包后当虚拟环境使

你是 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

https://github.com/pdm-project/pdm

可以,PDM 就是这样工作的

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服