zoukankan      html  css  js  c++  java
  • 优雅的使用python之环境管理

    优雅的使用python之环境管理

    缘起

    情景1:不同python版本的管理

    同一电脑上的多个python版本之前的管理,为了突出问题的普遍存在,下面是有人在segmentfault上提的问题。

    clip_image001

    摘自:http://segmentfault.com/q/1010000000162043

    情景2:同一python版本中同一库的不同版本管理

    例如在python2.7应用A是基于Django1.6,应用B是基于Django1.7的,这种情况怎么管理。

    为解决以上问题,下面隆重介绍下virtualenvvirtualenvwrapper

    virtualenv

    摘自virtualenv官网的https://virtualenv.pypa.io/en/latest/virtualenv.html一段介绍:

    The basic problem being addressed is one of dependencies and versions, and indirectly permissions. Imagine you have an application that needs version 1 of LibFoo, but another application requires version 2. How can you use both these applications? If you install everything into/usr/lib/python2.7/site-packages (or whatever your platform’s standard location is), it’s easy to end up in a situation where you unintentionally upgrade an application that shouldn’t be upgraded.

    Or more generally, what if you want to install an application and leave it be? If an application works, any change in its libraries or the versions of those libraries can break the application.

    Also, what if you can’t install packages into the global site-packages directory? For instance, on a shared host.”

    大意就是virtualenv用于在一台机器上创建多个独立的python运行环境,可以解决:

    l  隔离项目之间的第三方包依赖

    l  在没有权限的情况下安装新的Python软件包

    除此之外,还有一个额外的好处:部署应用时,把开发环境的虚拟环境打包到生产环境即可。

    安装

    方式一:通过pip

    [sudo] pip install virtualenv

    方式二:源码方式

    下载、解压

    cd virtualenv-X.X

    [sudo] python setup.py install

    方式N…

    使用

    创建虚拟环境

    virtualenv [虚拟环境名称] /virtualevn.exe [虚拟环境名称]

    我的环境是windows python3.4,这样创建虚拟环境:

    E:>D:Python34Scriptsvirtualenv.exe env_py3.4

    Using base prefix 'D:\Python34'

    New python executable in env_py3.4Scriptspython.exe

    Installing setuptools, pip...done.

    创建虚拟环境env_py3.4之后,对应目录下面有以下文件夹:

    E:env_py3.4 的目录

    2014/11/26  15:38    <DIR>          .

    2014/11/26  15:38    <DIR>          ..

    2014/05/16  15:34    <DIR>          Include

    2014/11/26  15:38    <DIR>          Lib

    2014/11/26  15:38    <DIR>          Scripts

    其中Lib/site-packages包含了,从系统安装的python3.4下面的库。默认情况下,虚拟环境会依赖系统环境中的site packages,就是说系统中已经安装好的第三方package也会安装在虚拟环境中,如果不想依赖这些package,那么可以加上参数 --no-site-packages建立虚拟环境

    virtualenv --no-site-packages [虚拟环境名称]

     

    启用虚拟环境

     

     

    source bin/activate或者 Scriptsactivate.bat

    启用虚拟环境之后,命令行提示符将以虚拟环境名为前缀,如(env_py3.4) E:env_py3.4>。也可以通过python打印出os.sys.path进行验证,如在我的env_py3.4虚拟环境启用之后,系统path路径如下所示:

    E:env_py3.4>Scriptsactivate

    (env_py3.4) E:env_py3.4>python

    Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:24:06) [MSC v.1600 32 bit (In

    tel)] on win32

    Type "help", "copyright", "credits" or "license" for more information.

    >>> import os

    >>> print(os.sys.path)

    ['', 'E:\env_py3.4\Scripts\python34.zip', 'E:\env_py3.4\DLLs', 'E:\env_py3

    .4\lib', 'E:\env_py3.4\Scripts', 'D:\Python34\Lib', 'D:\Python34\DLLs', '

    E:\env_py3.4', 'E:\env_py3.4\lib\site-packages']

    os.sys.path中可以看出,这个环境下执行python相关的操作都是限定在虚拟环境中。

    退出虚拟环境

     

    bin/deactivate 或者 Scriptsdeactivate

    如退出env_py3.4虚拟环境,命令行提示符前缀也相应改变了。

    (env_py3.4) E:env_py3.4>Scriptsdeactivate

    E:env_py3.4>

     

    在虚拟环境中安装新的python软件包,跟正常的python一样,并且虚拟环境中已经附带pipeasy_install等工具,可以非常方便的使用。

    virtualenvwrapper

    Virtualenvwrapper 是一个Virtualenv extension,可使虚拟环境的管理变得更容易。详细来说,Virtualenvwrapper 提供下述功能:

    l  将所有的虚拟环境整合在一个目录下。

    l  管理(新增、移除、复制)所有的虚拟环境。

    l  可以使用一个命令切换虚拟环境。

    l  Tab 补全虚拟环境的名字。

    l  每个操作都提供允许使用者自定的hooks

    l  可撰写容易分享的extension plugin 系统。

    安装

    通过pip或者easy_install安装virtualenvwrapper

    pip install virtualenvwrapper

    默认virtualenvwrapper安装在/usr/local/bin下面,实际上你需要运行virtualenvwrapper.sh文件才行。

     

    说明:virtualenvwrapper is a set of shell functions defined in Bourne shell compatible syntax。所以在window平台下,是不是使用不了的,但是对应有一个virtualenvwrapper-win版本(https://pypi.python.org/pypi/virtualenvwrapper-win)。

    virtualenvwrapper-win将安装在python根目录下面,如D:Python34

    # using pip
    pip install virtualenvwrapper-win
     
    # using easy_install
    easy_install virtualenvwrapper-win
     
    # from source
    git clone git://github.com/davidmarble/virtualenvwrapper-win.git
    cd virtualenvwrapper-win
    python setup.py install

     

    使用

    virtualenvwrapper-winvirtualenvwrapper的使用方式完全一样:

    l  列出虚拟环境列表:workon 或者lsvirtualenv

    l  新建虚拟环境:mkvirtualenv [虚拟环境名称]

    l  启动/切换虚拟环境:workon [虚拟环境名称]

    l  删除虚拟环境:rmvirtualenv [虚拟环境名称]

    l  离开虚拟环境:deactivate.

    例如,我创建了3个虚拟环境

           …….

    (vn_py3.4_app2) D:Python34>mkvirtualenv.bat vn_py3.4_app3

    Using base prefix 'D:\Python34'

    New python executable in vn_py3.4_app3Scriptspython.exe

    Installing setuptools, pip...done.

     

    (vn_py3.4_app3) D:Python34>workon.bat

     

    Pass a name to activate one of the following virtualenvs:

    ==========================================================

    vn_py3.4_app1

    vn_py3.4_app2

    vn_py3.4_app3

    默认创建的虚拟环境路径为:%USERPROFILE%Envs,即C:Users用户名Envs

    切换虚拟环境:

    (vn_py3.4_app3) D:Python34>workon.bat vn_py3.4_app1

    (vn_py3.4_app1) D:Python34>workon.bat vn_py3.4_app2

    (vn_py3.4_app2) D:Python34>

     

    注意:如果window下面碰到D:Python34Scripts>mkvirtualenv.bat F:evn_py3.4_app1

    python.exe: can't open file 'D:Python34Scriptsvirtualenv-script.py': [Errno 2

    ] No such file or directory,修改mkvirtualenv.bat中的python.exe "%PYHOME%Scriptsvirtualenv-script.py" %ARGS% ==python.exe "%PYHOME%Scriptsvirtualenv.exe" %ARGS%即可。

    总结

    基于virtualenv + virtualenvwrapper可以很好的完成环境隔离,保证对每个应用的环境是干净的。而且对一个干净的环境可以通过:

    pip freeze > requirements.txt将包依赖信息保存在requirements.txt文件

    pip install -r requirements.txt会自动从网上下载并安装所有包

    方便应用部署分发,关于pip软件包管理再下一篇介绍。

     

    相关连接:

    https://virtualenv.pypa.io/en/latest/index.html

    http://virtualenvwrapper.readthedocs.org/en/latest/index.html

    https://pypi.python.org/pypi/virtualenvwrapper-win

  • 相关阅读:
    记一次文件转码与二进制查看学习
    JAVA线程池 之 Executors (二) 原理分析
    JAVA线程池 之 Executors (一) 简介
    问题:部分mysql版本问题
    Java中一个方法字节码的长度会影响程序并发下的性能?
    AccessController.doPrivileged
    Nginx配置WebService、MySQL、SQL Server、ORACLE等代理
    C# 序列化Json时如何忽略JsonProperty(PropertyName =“ someName”)
    C# 文件上传(另一台服务器的共享目录)
    C# 导入Excel读取图片上传
  • 原文地址:https://www.cnblogs.com/skynet/p/4124763.html
Copyright © 2011-2022 走看看