Python 多环境管理工具, 这两款可能都不错: Pyenv 和 Virtualenv .
Pyenv , 是对 Python 的版本进行管理, 实现版本的切换.
Virtualenv , 是通过创建虚拟环境, 实现 Python 环境间的隔离, 避免相互干扰.
Virtualenv 部署
首先得先准备好 Python 和 pip.Windows 系统去官网下载安装后就都有了.
CentOS7 安装 python3 可以看这篇: http://blog.51cto.com/steed/2288045
用 pip 安装 Virtualenv
pip install virtualenv
安装过程:
- $ pip install virtualenv
- Collecting virtualenv
- Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
100% |████████████████████████████████| 1.9MB 59kB/s
- Installing collected packages: virtualenv
- Successfully installed virtualenv-16.0.0
- $
使用方法
这段可以跳过, 看下面的小节, 直接干
命令使用格式如下:
virtualenv [选项] 目标目录
最基本的用法, 创建虚拟目录就是这样:
virtualenv /opt/ansible/venv
上面的命令将会创建指定的文件夹, 包含了 Python 可执行文件, 以及 pip 库的一份拷贝. 如果你的本地 pip 库已经装了别的模块了, 那么新的虚拟环境也会包含这些模块. 如果不想这样, 就要加上一些参数选项.
下面列出了一些可用的选项:
--version : 显示当前版本号
-h, --help : 显示帮助信息
-v, --verbose : 显示详细信息
-q, --quiet : 不显示详细信息
-p PYTHON_EXE, --python=PYTHON_EXE : 指定所用的 python 解析器的版本 (下面会展开)
--clear : 清空非 root 用户的安装, 并从头开始创建隔离环境
--no-site-packages : 令隔离环境不能访问系统全局的 site-packages 目录. 意思看不懂, 下一节会用到
--system-site-packages : 令隔离环境可以访问系统全局的 site-packages 目录
--unzip-setuptools : 安装时解压 Setuptools 或 Distribute .
--relocatable : 重定位某个已经存在的隔离环境. 使用该选项将修正脚本, 并令所有. pth 文件使用相应路径.
--distribute : 使用 Distribute 代替 Setuotools , 也可设置环境变量 VIRTUALENV_DISTRIBUTE 达到同样效果.
--extra-search-dir=SEARCH_DIRS : 用于查找 setuptools,distribute,pip 发布包的目录. 可以加多个路径.
--never-download : 禁止从网上下载任何数据. 如果用上面的路径在本地搜索失败, 会报错.
--prompt==PROMPT : 定义隔离环境的命令行前缀.
用下面的命令, 可以选择指定的 Python 解释器创建虚拟环境:
$ virtualenv -p /usr/bin/python2.7 venv
如果有多个 Python 解释器, 比如在 CentOS7 上安装 python3.6. 默认的 Python 解释器不是要使用的, 就要用 -p 参数设置一下了.
默认使用的解释器, 可能是根据 pip 来决定的. 我试的时候, CentOS 默认有 python2.7, 我又安装了 python3.6. 使用 python 命令启动的是 python2.7. 但是 python2.7 没有安装 pip , pip 是安装在 python3.6 下的. 启动 pip 用的是 python3.6, 如下:
- $ pip -V
- pip 18.1 from /usr/local/lib/python3.6/site-packages/pip-18.1-py3.6.egg/pip (python 3.6)
我实际安装虚拟环境的时候, 没有用 -p 指定解释器, 默认用的也是 python3.6 .
创建虚拟环境
创建工作目录:
$ mkdir /opt/ansible
在工作目录下, 创建一个独立的虚拟环境, 命名为 venv:
- $ cd /opt/ansible
- $ virtualenv --no-site-packages venv
- Using base prefix '/usr'
- New python executable in /opt/ansible/venv/bin/python3.6
- Also creating executable in /opt/ansible/venv/bin/python
- Installing setuptools, pip, wheel...done.
- $
命令 virtualenv 就可以创建一个独立的 Python 运行环境, 我们还加上了参数 --no-site-packages, 这样, 已经安装到系统 Python 环境中的所有第三方包都不会复制过来, 这样, 我们就得到了一个不带任何第三方包的 "干净" 的 Python 运行环境.
使用虚拟环境
使用 source 命令可以进入指定的虚拟环境, 命令后面要跟虚拟环境目录下的 bin/activate 文件:
- $ source /opt/ansible/venv/bin/activate
- (venv) $
退出虚拟环境用 Deactivate 命令:
- (venv) $ deactivate
- $
这里都注意一下切换虚拟环境前后命令提示符的变化
测试
下面切换到虚拟环境下, 安装个模块试下:
- $ source /opt/ansible/venv/bin/activate
- (venv) $ pip install ansible
- """中间的安装日志就省略了"""
- Successfully built ansible PyYAML MarkupSafe pycparser
- Installing collected packages: MarkupSafe, jinja2, PyYAML, pycparser, cffi, six, pynacl, asn1crypto, idna, cryptography, bcrypt, pyasn1, paramiko, ansible
- Successfully installed MarkupSafe-1.0 PyYAML-3.13 ansible-2.7.0 asn1crypto-0.24.0 bcrypt-3.1.4 cffi-1.11.5 cryptography-2.3.1 idna-2.7 jinja2-2.10 paramiko-2.4.2 pyasn1-0.4.4 pycparser-2.19 pynacl-1.3.0 six-1.11.0
- (venv) $ ansible --version
- ansible 2.7.0
- config file = None
- configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
- ansible python module location = /opt/ansible/venv/lib/python3.6/site-packages/ansible
- executable location = /opt/ansible/venv/bin/ansible
- python version = 3.6.6 (default, Aug 13 2018, 18:24:23) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
- (venv) $ deactivate
- $ ansible --version
-bash: ansible: 未找到命令
- $ /opt/ansible/venv/bin/ansible --version
- ansible 2.7.0
- config file = None
- configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
- ansible python module location = /opt/ansible/venv/lib/python3.6/site-packages/ansible
- executable location = /opt/ansible/venv/bin/ansible
- python version = 3.6.6 (default, Aug 13 2018, 18:24:23) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
- $
切换到虚拟环境下安装, 安装完之后, 可以使用安装的模块.
然后退出虚拟环境, 再次尝试使用之前的模块, 就提示找不到命令了.
其实只是系统的环境变量变了, 安装的模块还在, 但是不在环境变量里, 所以就找不到了, 指定路径的话还是有的
总结
virtualenv 为应用提供了隔离的 Python 运行环境, 解决了不同应用间多版本的冲突问题.
要删除一个虚拟环境, 只需删除它的文件夹.(执行 rm -rf venv ).
来源: http://blog.51cto.com/steed/2298681