Python 多版本共存问题 2

本文主要讨论 多种版本的 Python 模块的共存与调用问题,并尝试给出一种清爽的解决办法。

多种版本的Python module?

伴随 Python 逐步成为数据科学领域的主力研发语言,越来越多的机器学习库都发布了 Python 版本,包括了著名的 scikit-learn,tensorflow,keras 等。正是由于数据科学近年来在基础算法和计算架构上的迅猛发展,这些Python module 也频繁地发布新版本。

最令人恶心的 Tensorflow 还未发布稳定版 1.0.0 之前时,几乎每个次级版本的Tensorflow的 API都不一样。当然这主要是由于深度学习领域的算法层出不穷,另一方面我个人猜测是由于Tensorflow代码在不断根据google的计算平台变化做出演进。

那么问题就来了,可能三个月前自己写的 Seq2Seq 的 tf 代码,在新版的 Tensorflow 中就已经不能运行,这就是因为版本变化带来的API变化导致。那么有人说,只要我一直不更新 TF 不就好了吗?

理想丰满,现实骨感!

  • 笔者使用的Ubuntu 机器是实验室共有的,TF 是否更新,服务器管理员的决定权也是很重要的!
  • 最新版本的 TF 的计算效率相对来说总是在改进的:新版的 TF 可以使用更新的 CUDA 版本以及 CUDNN版本。
  • 新来的开发者通常愿意去采用最新稳定版的 TF 来开发算法,如果要使用他们开发的算法,那么势必需要在对应的 TF 版本中才能运行。 有鉴于此,为了同时运行新老代码,我们通常选择在同一台机器上 配置共存的多版本 Module。

如何配置并使用多种版本module?

一个简单的想法是,对每一个开发任务,创建一个单独的环境,这个环境有独立于外界的模块。只要我们进入了这个单独的环境,就可以在里面安装并使用任务对应版本的模块了。

幸运的是,这样做的方法有很多,例如 docker。但这里我们暂时用不到这么高大上的技术,我们只需要采用 virtualenv 命令即可。

1、利用 virtualenv 命令创建独立的 Python 环境

virtualenv 的安装

# 安装 Python 2.7下的virtualenv

sudo pip install virtualenv

采用 virtualenv 命令创建一个独立的 Python 环境

# 创建一个空间放置我可能创建的多个环境

mkdir ~/my_lib/py_env cd ~/my_lib/py_env

# 假设系统默认的 Python 为 Python 2.7

# 创建 Python 2.7 的独立环境

virtualenv py27_env

如何进入该独立的 Python 环境呢?

注意到,这里的进入 独立的Python环境的意思并不是一定要 cd 到上一步创建的Python独立环境所在文件夹处,几乎可以在任意位置启动环境。

启动环境的意思是,在这个环境中,除了 Python 相关的命令,其余诸如 cd,ls等命令与外界无异,只有和 Python 相关的命令例如 pip, python 等才会有独立于外界的命令。

cd ~

# 可以在任意位置进入该 Python 环境

source ~/my_lib/py_env/py27_env/bin/activate

# 事实上,上述命令可以理解为将 ~/my_lib/py_env/py27_env/bin 加入系统路径,且优先级最高。但 ~/my_lib/py_env/py27_env/bin 文件夹中只存在和 Python 相关的命令,因此只有 Python 相关命令的执行会受该环境的影响

如何退出该独立的 Python 环境

deactivate

2、在对应的独立环境中安装任意版本的模块

我们这里的任务是创建一个 Python 3.5 环境,然后利用 pip 安装 tensorflow 的1.0.1 gpu版本

先创建 Python 3.5 环境,激活它

# 创建 Python 3.5 环境

# -p PYTHON_EXE_PATH 参数,也可以换成 --python=PYTHON_EXE_PATH

# 代表创建的该独立环境所依据的系统 Python 命令来自哪儿,改变参数可以得到不同版本 Python 独立环境virtualenv -p /usr/bin/python3.5 ~/my_lib/py_env/py35_env

# 激活它source ~/my_lib/py_env/py35_env/bin/activate

安装 tensorflow 1.0.1 gpu 版本

pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.1-cp34-cp34m-linux_x86_64.whl

# 这里的执行的命令 pip 换成 pip3 或者 pip3.5都可以,这三个命令都是~/my_lib/py_env/py35_env/bin/ 中的

# 值得注意的是,这里可以运行 pip2,这里的 pip2就是系统命令了,即 /usr/bin/pip2了。可以采用 which pip2 验证一下which pip2 which pip which pip3 which pip3.5

可以进入 Python 解释器看看

# 以下三个命令都可以进入 该独立环境对应的 Python 3.5环境python python3 python3.5

进入解释器之后

import tensorflow as tf# 查看该 tensorflow 的安装位置print(tf.__path__)

virtualenv 的更多选项

这里的系统 Python 环境是指创建该独立环境时的 -p 参数

1)--no-site-packages 选项代表 安装到系统Python环境中的所有第三方包都不会复制过来,目前我看到这个是默认执行的

2)--system-site-packages 选项代表该虚拟环境可以访问系统 Python环境中的 第三方包

3)更多的选项直接在 shell 端输入 virtualenv 即可查看

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2018-03-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mySoul

测试用例概念 原则

测试用例为一组条件或变量,根据其来确定应用软件是否能够正常的工作。其条件和变量为测试用例。

1002
来自专栏哲学驱动设计

OEA 中的业务控制器设计模式

对于业务逻辑的组织,个人认为,最好是使用 DDD(《Domain Driven Design》) 的方式。DDD 使用领域模型来表达实体间的关系,同时在应用层使...

1866
来自专栏Crossin的编程教室

【每日一坑 6】 查找文件内容

Hello 大家好,我终于又来挖坑了。 上次的坑好像反响不是很好,论坛上只有两份解答。其实这题难度不大,不用什么特殊的函数来解决,就是字符串、队列的各种操作,可...

2717
来自专栏kangvcar

[face_recognition中文文档] 第2节 安装

1353
来自专栏PHP在线

mysql 分库分表

分表是分散数据库压力的好方法。 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库。 当然,首先要知道什么情况下,才需要...

4876
来自专栏FreeBuf

CVE-2018-5711:一张GIF图片就能让服务器宕机的PHP漏洞

最近,台湾Web漏洞挖掘大牛Orange Tsai在对一些Web开发框架和程序实现模块进行安全审核的过程中,发现了一些有意思的漏洞。就比如说,这个PHP的CVE...

2719
来自专栏Linyb极客之路

同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑...

1152
来自专栏Material Design组件

Human Interface Guidelines — Settings

1364
来自专栏韩伟的专栏

浅析海量用户的分布式系统设计(2)

分布式系统是一个由很多进程组成的整体,这个整体中每个成员部分,都会具备一些状态,比如自己的负责模块,自己的负载情况,对某些数据的掌握等等。而这些和其他进程相关的...

9091
来自专栏Java架构解析

Nginx 学习系列——正向代理与反向代理

无论是正向代理,还是反向代理,说到底,就是代理模式的衍生版本罢了。我们都学习过代理设计模式,都知道代理模式中有代理角色和被代理角色,为什么这么说,因为这两个角色...

1670

扫码关注云+社区