写在最前

在使用 Python 进行开发和部署的时候,经常会碰到Python版本或者依赖包或者对应版本不同导致各种意外情况发生。

本文将介绍如何通过 pyenv, virtualenv, pip三个工具来管理环境,以保证团队内部,使用的Python版本以及使用的依赖包版本都高度一至,并且有很高的移植性。

pyenv, virtualenv, pip 的安装网上资料很多,这里不再赘述

Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具

我的演示环境

CentOS 7.4.1708
pyenv 1.2.14-5-g68a77df0
Python 3.6.9
pip 16.7.7

在实践之前,我们先快速了解几个工具的功能和基本用法

pyenv 版本管理

1. 查看可安装的Python版本

pyenv install --list

这个命令会列出所有pyenv收纳的所有版本

2. 安装指定Python版本

pyenv install 3.6.9

pyenv install --list中找到需要的版本号,使用上面的命令安装即可

安装过程需要花几分钟的时间

3. 查看已安装的版本

pyenv versions

4. 设定当前版本

我们可以pyenv versions列出的版本中,选择想要的Python版本

pyenv global 3.6.9
pyenv local 3.6.9

上面两个命令都是用于设定当前的Python版本号,不同之处在于:

  • pyenv global 作用于全局
  • pyenv local 仅作用于当前目录

virtualenv 虚拟环境管理

1. 生成虚拟环境

virtualenv --no-site-packages .venv

这个命令会在当前目录下生成一个 .venv 文件夹,用于存放虚拟环境相关的文件。正常情况下这个目录是我们项目的根目录。

需要说明的是,要生成干净的虚拟环境一定要加上--no-site-packages,否则创建的虚拟环境仍然会包含系统环境下的一些依赖包。

.venv是我们的虚拟环境的名称,这里想多说一句,之所以使用在环境面前加了一个点,是在 windows 和 Linux 下以点开头的文件一般不会直接显示出来,这样在视觉会更舒服一些。

2. 激活虚拟环境

source .venv/bin/activate
# windows 下使用 .\.venv\Scripts\activate.bat

创建好虚拟环境之后,还要激活才能进入到我们刚刚创建的虚拟环境

3. 关闭虚拟环境

deactivate

当要在其它项目上工作前或者其它不需要当前环境时,需要用上面的命令关闭虚拟环境

pip 依赖包管理

安装依赖包

pip install package_name

只要把 package_name 替换成要安装的包名即可

查看已安装的依赖包

pip freeze

备份依赖包列表

pip freeze > requirements.txt

将上面的内容重定向到一个文件里面,习惯上我都把这个文件命令为requirements.txt

批量安装依赖包

pip install -r requirements.txt

这个命令的作用在于,当我们把项目移交到别的机器时

可以根据原来的配置安装需要的依赖包,而不会出现遗漏或者多安装的情况。

实战

讲了我们需要用到的几个工具的基本使用之后,我们来进行一次实战

1. 创建项目并进行环境管理

新建一个目录 demo_python_env,并进入到这个目录

~ » mkdir demo_python_env
~ » cd demo_python_env

创建虚拟环境

~/demo_python_env » virtualenv --no-site-packages .venv
Using base prefix '/home/x/.pyenv/versions/3.6.9'
New python executable in /home/x/demo_python_env/.venv/bin/python3.6
Also creating executable in /home/x/demo_python_env/.venv/bin/python
Installing setuptools, pip, wheel...
done.

激活虚拟环境

(.venv)~/demo_python_env » source .venv/bin/activate

安装 requests 依赖包

(.venv)~/demo_python_env » pip install requests
Collecting requests
Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
Using cached https://files.pythonhosted.org/packages/e0/da/55f51ea951e1b7c63a579c09dd7db825bb730ec1fe9c0180fc77bfb31448/urllib3-1.25.6-py2.py3-none-any.whl
Collecting certifi>=2017.4.17
Using cached https://files.pythonhosted.org/packages/18/b0/8146a4f8dd402f60744fa380bc73ca47303cccf8b9190fd16a827281eac2/certifi-2019.9.11-py2.py3-none-any.whl
Collecting idna<2.9,>=2.5
Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2
Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Installing collected packages: urllib3, certifi, idna, chardet, requests
Successfully installed certifi-2019.9.11 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.6

保存当前的依赖包列表到 requerements.txt 中

(.venv)~/demo_python_env » pip freeze > requerements.txt

新建一个测试文件

(.venv)~/demo_python_env » touch test.py

键入以下内容,这段代码功能是向 github 发一个请求,并打印出响应状态码

import requests

res = requests.get('https://api.github.com/events')
print('** status_code = {} **'.format(res.status_code))

测试是否能正常

(.venv)~/demo_python_env » python test.py
** status_code = 200 **

关闭虚拟环境

~/demo_python_env » deactivate

2. 在新机器上搭建相同的项目环境

demo我提交到github上,大家可以用于做第二步的练习 https://github.com/1lin24/demo_python_env

我们假设,同事的代码已经上传到公司的git服务器,我先将代码下载到我的机器上,并切换到这个目录中

~ » git clone https://github.com/1lin24/demo_python_env.git
Cloning into 'demo_python_env'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
~ » cd demo_python_env

查看项目文件

~/demo_python_env(master) » ls -la
total 24
drwxrwxr-x 3 x x 4096 Nov 7 15:44 .
drwx------ 11 x x 4096 Nov 7 15:44 ..
drwxrwxr-x 8 x x 4096 Nov 7 15:44 .git
-rw-rw-r-- 1 x x 1297 Nov 7 15:44 .gitignore
-rw-rw-r-- 1 x x 77 Nov 7 15:44 requerements.txt
-rw-rw-r-- 1 x x 125 Nov 7 15:44 test.py

创建虚拟环境

~/demo_python_env(master) » virtualenv --no-site-packages .venv
\Using base prefix '/home/x/.pyenv/versions/3.6.9'
New python executable in /home/x/demo_python_env/.venv/bin/python3.6
Also creating executable in /home/x/demo_python_env/.venv/bin/python
Installing setuptools, pip, wheel...
done.

激活刚刚创建的虚拟环境

(.venv)~/demo_python_env(master) » source .venv/bin/activate

安装项目需要的依赖包

(.venv)~/demo_python_env(master) » pip install -r requerements.txt
Collecting certifi==2019.9.11
Using cached https://files.pythonhosted.org/packages/18/b0/8146a4f8dd402f60744fa380bc73ca47303cccf8b9190fd16a827281eac2/certifi-2019.9.11-py2.py3-none-any.whl
Collecting chardet==3.0.4
Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Collecting idna==2.8
Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
Collecting requests==2.22.0
Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
Collecting urllib3==1.25.6
Using cached https://files.pythonhosted.org/packages/e0/da/55f51ea951e1b7c63a579c09dd7db825bb730ec1fe9c0180fc77bfb31448/urllib3-1.25.6-py2.py3-none-any.whl
Installing collected packages: certifi, chardet, idna, urllib3, requests
Successfully installed certifi-2019.9.11 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.6

运行测试代码

(.venv)~/demo_python_env(master) » python test.py
** status_code = 200 **

关闭虚拟环境

~/demo_python_env(master) » deactivate

这是我自己使用的python环境管理方案,希望能够帮助到需要的人,如果你有更好的方案,请一定告诉我哦

ReadMore

pyenv 官方文档

virtualenv 官方文档

pip 官方文档

欢迎指教,留言交流

打造完美Python环境(pyenv, virtualenv, pip)的更多相关文章

  1. Ubuntu下python使用pyenv+virtualenv进行版本和包隔离

    安装pyenv 参考:https://github.com/pyenv/pyenv git clone https://github.com/pyenv/pyenv.git ~/.pyenv echo ...

  2. 独立python环境之virtualenv和virtualenvwrapper

    介绍 如果有一台測试机,多个人使用,有多个项目,不同项目可能python版本号不一样.须要的库不一样. 我们须要一个独立干净的python环境,互相隔离,互不影响. virtualenv能够帮我们解决 ...

  3. 【七天搞定Python】day01.Python环境配置、pip、IDE、注释、变量,数据类型、标识符/关键字、输出、输入

    什么是Python? 动态解释型语言,1982年由荷兰人Guido von Rossum发明. 更多细节可以google,这里不做展开. Python解释器: CPython(官方版本C语言实现) I ...

  4. Python环境搭建-4 pip的安装和使用

    pip的安装和使用 我们都知道python有很多的第三方库或者说是模块.这些库针对不同的应用,发挥不同的作用.我们在实际的项目中肯定会用到这些模块.那如何将这些模块导入到自己的项目中呢? Python ...

  5. [Python]环境配置之pip加速

    背景 学习 Python 的话,仅掌握标准库是远不够的,有很多好用的第三方库我们也需要用到的,比如,由鼎鼎大名的 K 神开发的爬虫必不可少的 requests 库,一般都是必装的库吧.安装第三方库当然 ...

  6. 关于virtualenv python环境引用 pycharm相关配置的使用讨论

    今天总算决定来搞一波以前从来没有弄清楚的环境问题,也觉得是时候弄明白了. 这里先说关于python的环境引用,再谈到virtualenv最后再谈论我使用的pycharm5.0关于是用python环境的 ...

  7. Python linux 上的管理工具 pyenv 安装, pip 使用, python项目(版本分割, 项目分割, 虚拟环境创建)

    01: 假设你有一个最小环境安装的 centos-6.x 的linux操作系统 02: 安装 git => yum -y install git 03: 安装依赖 => yum -y in ...

  8. pyenv virtualenv和virtualwrapper

    pyenv pyenv最大的优势是:可以在”全局”管理不同版本的Python, 可以随时配置当前的使用的Python版本,并对其他使用Python解释器的程序生效.当系统安装多个版本的Python,使 ...

  9. Python虚拟环境工具-Virtualenv 介绍及部署记录

    在开发Python应用程序时,系统默认的Python版本可能会不兼容这个应用程序, 如果同时开发多个应用程序, 可能会用到好几个版本的python环境, 这种情况下,每个应用可能需要各自拥有一套&qu ...

随机推荐

  1. java 时间的原生操作和工具类操作

    package com.xc.test.dateoperation; import org.apache.commons.lang3.time.DateFormatUtils; import org. ...

  2. kafka删除topic后再创建同名的topic报错(ERROR org.apache.kafka.common.errors.TopicExistsException)

    [hadoop@datanode3 logs]$ kafka-topics.sh --delete --zookeeper datanode1:2181 --topic firstTopic firs ...

  3. HTML布局排版手机上浏览的网页

    前面做个几个简单的测试html布局排版的页面,都是在浏览器上查看的,C-LODOP可通过集中打印和广域网AO打印方式,让手机等也可以打印预览和打印. 集中打印的大体方法是通过一台windows电脑作为 ...

  4. eNSP上VLAN的基础的配置及access接口

    本实验模拟公司内部,为不同的部门划分不同的VLAN ,形成的不同广播域,来保护信息的安全,拓扑图如下所示

  5. 什么?Iconfont终于可以支持彩色图标了

    如果你对iconfont有所了解,那你一定对这次iconfont做出的更新产生兴趣.没错,iconfont目前已经升级为iconfont+,并且能够支持大家都很期待的彩色图标. 之前,大家也以文字的形 ...

  6. php密码正则匹配

    <?php /** * @param $pwd * @return string */ function isPwd($pwd){ $pattern= '/^[0-9a-z_$]{6,16}$/ ...

  7. hadoop 集群调优实践总结

    调优概述# 几乎在很多场景,MapRdeuce或者说分布式架构,都会在IO受限,硬盘或者网络读取数据遇到瓶颈.处理数据瓶颈CPU受限.大量的硬盘读写数据是海量数据分析常见情况. IO受限例子: 索引 ...

  8. Flink状态管理和容错机制介绍

    本文主要内容如下: 有状态的流数据处理: Flink中的状态接口: 状态管理和容错机制实现: 阿里相关工作介绍: 一.有状态的流数据处理# 1.1.什么是有状态的计算# 计算任务的结果不仅仅依赖于输入 ...

  9. Ribbon源

    在Riibon中一个非常重要的组件为LoadBalancerClient,它作为负载均衡的一个客户端 ServiceInstance choose(String serviceId); 从负载均衡器中 ...

  10. Python31之类和对象1(三大特征:多封继——多疯子)

    一.对象: Python即是面向对象的编程也是面向过程的编程语言,其内部可谓是无处不对象,我们所熟知的列表,字符串等工厂函数本质上都是对象.对象其实是对属性和方法的封装. 属性是对象的静态特征 方法是 ...