前提
由于脚本功能特别多,所以采取逐步迁移功能的方式,因此机器上需要保证脚本能在py2和py3环境下同时运行
具体方式:之前脚本运行的py2环境保持不变,迁移至py3环境后,用虚拟环境的方式来运行
对于虚拟环境来说,目前可以使用virtualenv,venv,
Pipenv, Peotry,Conda
virtualenv: 需要pip install 依赖包的虚拟环境
venv: python3自带的虚拟环境
Pipenv: 虚拟环境+包管理+py版本切换,目前看内部文档,好多采取了此方案,对比buildout也有一些好处:[Pipenv 使用指南](https://wiki.in.zhihu.com/pages/viewpage.action?pageId=66325089)
Peotry: 虚拟环境+包管理
Conda:支持不同版本 python 安装,包管理,虚拟环境,支持不同语言
目前脚本的包管理方式是 zc.buildout ,如果要沿用之前脚本的方式,则可以使用虚拟环境 + zc.buildout 方式,或者按建议使用 Pipenv 方式
因此对两种方案进行对比尝试
方案
方式一、zc.buildout
1.venv 创建 虚拟环境
python3 -m venv /data1/cheetah/venv36
- 激活虚拟环境
. venv3/bin/activate
- 退出虚拟环境
deactivate
- 安装buildout 等依赖, 注意以下操作均在虚拟环境中执行
pip install --upgrade pip
pip install zc.buildout
pip uninstall setuptools # 如果不先卸载当前的,会造成之后安装 cryptography 脚本失败
pip install setuptools==50
pip install setuptools_rust
pip install cryptography==3.4.7
方式二、Pipenv
1.安装pipenv
pip3 install --user pipx
pipx install pipenv
或者:pip3 install pipenv
服务器需要:python3 -m pipenv --three 执行,没有用sudo pip3 install ,因此默认没有在/usr/local/bin/pipenv 中生成
pipenv --three
3.指定虚拟环境目录
(1)在初始化虚拟环境的时候,pipenv默认会把虚拟环境的python目录以 及后来安装的各种模块放到/home/$username/.local/share/virtualenvs
(2)export PIPENV_VENV_IN_PROJECT=1 设置这个环境变量,pipenv会在当前目录下创建.venv的目录,以后都会把模块装到这个.venv下
(3)自己在项目目录下手动创建.venv的目录,然后运行 pipenv run 或者 pipenv shell pipenv都会在.venv下创建虚拟环境
(4)设置WORKON_HOME到其他的地方 (如果当前目录下已经有.venv,此项设置失效)
export WORKON_HOME=/data1/pipvitrual
3.卸载虚拟环境
pipenv --rm
4.激活虚拟环境
pipenv shell
5.退出虚拟环境
exit
6.生成requeirement.txt
pipenv lock -r
- 安装setup.py中声明的packages,并跳过锁版本
pip install -e . --skip-lock
缺点:
1.安装依赖的时候如果不跳过lock会很慢,即使跳过了 lock 相对于zc.builodut也是比较慢的
https://zhuanlan.zhihu.com/p/80695813
2. 虚拟环境目录如果项目路径有变化,那虚拟环境目录就会变化,因此在mr阶段就无法保证虚拟环境地址的唯一性,因为mr阶段的地址路径不同,就会造成每次都需要下载安装依赖包
说明:
Pipfile vs setup.py:
https://pipenv-zh.readthedocs.io/zh_CN/latest/advanced.html#configuration-with-environment-variables
最终方案
1.由于Pipenv 安装依赖比较慢,会增加耗时,因此最终我们采用方案一,将生成安装依赖的过程放到shell脚本中,每次执行项目前先执行此脚本或者预先在机器中执行此脚本生成虚拟环境
参考资料
https://www.kevinbai.com/articles/144.html
https://pipenv-zh.readthedocs.io/zh_CN/latest/advanced.html#configuration-with-environment-variables