Python 之所以强大,除了语言本身的特性外,更重要的是拥有无所不及的第三方库。强大的软件库,让开发者将精力集中在业务上,而避免重复造轮子的浪费。

但众多的软件库,形成了复杂的依赖关系,加上 Python2 和 Python3 旷日持久之争,对采用 Python 开发的项目造成了不少困扰,所以 Python 建议,通过虚拟环境工具为项目创建纯净的依赖环境,今天我们就来了解下 Python 虚拟环境。

一些概念

python版本

Python 版本指的是 Python 解析器本身的版本。由于 Python3 不能与 Python2 兼容,而且两大阵营之争持续了很长时间,导致一些软件库需要设配两种版本的 Python,同时开发者可能需要在一个环境中,部署不同版本的 Python,对开发和维护造成了麻烦。

因此出现了版本管理器 Pyenv,类似于 nodejs 的 nvm,可以创建出相互隔离的 Python 环境,并且可以方便的切换环境中的 Python 版本。

python 包管理器

软件包源中的软件包数量巨大,版本多样,所以需要借助于软件源管理工具,例如 pip、conda、Pipenv、Poetry 等

  • pip 是最常用的包管理工具,通过 pip install 命令格式来安装软件包,使用的是 pypi 软件包源

  • conda 多用作科学计算领域的包管理工具,功能丰富且强大,使用的软件包源是 Anaconda repository 和 Anaconda Cloud,conda 不仅支持 Python 软件包,还可以安装 C、C++ 、R 以及其他语言的二定制软件包。除了软件包管理外,还能提供相互隔离的软件环境。

  • Pipenv 是 Kenneth Reitz 在2017年1月发布的Python依赖管理工具,现在由PyPA维护。Pipenv 会自动帮你管理虚拟环境和依赖文件,并且提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作

  • Poetry 和 Pipenv 类似,是一个 Python 虚拟环境和依赖管理工具,另外它还提供了包管理功能,比如打包和发布。你可以把它看做是 Pipenv 和 Flit 这些工具的超集。它可以让你用 Poetry 来同时管理 Python 库和 Python 程序

很多包管理工具不仅提供了基本的包管理功能,还提供了虚拟环境构建,程序管理的等功能

Python虚拟环境

Python 应用经常需要使用一些包第三方包或者模块,有时需要依赖特定的包或者库的版本,所以不能有一个能适应所有 Python 应用的软件环境,很多时候不同的 Python 应用所依赖的版本是冲突的,满足了其中一个,另一个则无法运行,解决这一问题的方法是 虚拟环境。

虚拟环境是一个包含了特定 Python 解析器以及一些软件包的自包含目录,不同的应用程序可以使用不同的虚拟环境,从而解决了依赖冲突问题,而且虚拟环境中只需要安装应用相关的包或者模块,可以给部署提供便利

构建虚拟环境

原理

虚拟环境并不是什么新技术,主要是利用了操作系统中环境变量以及进程间环境隔离的特性。

Python 虚拟环境就是利用这个特性构建的,在激活虚拟环境之时,激活脚本会将当前命令行程序的 PATH 修改为虚拟环境的,这样执行命令就会在被修改的 PATH 中查找,从而避免了原本 PATH 可以找到的命令,从而实现了 Python 环境的隔离。

为了让开发容易区分当前环境是否虚拟环境以及是那个虚拟环境,命令提示符前会加上特殊标记,例如:

Python 虚拟环境

创建

virtualenv 工具

在 python3.3 之前,只能通过 virtualenv 创建虚拟环境,首先需要安装 virtualenv

pip install virtualenv

安装完后,在当前目录下创建一个名为 myvenv 的虚拟环境:

virtualenv --no-site-packages myvenv

参数 --no-site-packages 的意思是创建虚拟环境时,不复制主环境中安装的第三方包,也就是创建一个 “干净的” 虚拟环境

virtualenv 还有很多参数,用于不同的使用场景,例如:

  • -p: 用于指定 Python 解析器,就是安装好的 Python 应用程序,默认为当前环境中的 Python
  • --no-pip:不需要安装 pip,默认为安装
  • --clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清楚重建

venv 模块

Python3.3 之后,可以用模块 venv 代替 virtualenv 工具,好处是不用单独安装,3.3 及之后的版本,都可以通过安装好的 Python 来创建虚拟环境:

python -m venv myvenv

可以在当前目录创建一个名为 myvenv 的虚拟环境

venv 有些参数,不过相比 virtualenv 少了些,这里简单介绍几个:

  • --without-pip: 不需要安装 pip,默认为安装
  • --clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清楚重建

因为 venv 是依附于一个 Python 解析器创建的,所以不需要指定 Python 解释器版本

激活

虚拟环境创建好后,需要激活才能在当前命令行中使用,可以理解成将当前命令行环境中 PATH 变量的值替换掉

通过 virtualenv 和 模块 venv 创建的虚拟环境,激活方式是一样的,即运行激活脚本

  • Windows 系统中,激活脚本路径是 \Scripts\activate.bat,如果是 powershell 命令行,脚本换成 Activate.ps1 , 注意将 换成你自己的虚拟环境目录

  • Linux 系统中,激活脚本路径是 /bin/activate,默认脚本没有执行权限,要么设置脚本为可执行,要么用 source 命令执行,例如

    $ source myvenv/bin/activate

激活后,可以在命令行中看到虚拟环境标记,如上图

打印 PATH,命令如下:

Linux 下:

echo $PATH

Windows 下

echo %PATH%

可以看到创建的虚拟环境脚本目录被加载了最前面

退出

退出虚拟环境很简单,只需要执行 deactivate 命令就行,这个命令也在虚拟环境的脚本目录下,因为激活时,将脚本目录设置到 PATH 中了,所以可以直接使用。

退出虚拟环境相当于将 PATH 恢复成原来的。

与开发工具配合

虽然通过激活脚本,很容易切换到虚拟环境,但是在实际开发中,还是不够方便,而且现在很多开发工具,特别是提供 Python 解析环境的开发工具,都可以和虚拟环境配合,在开发过程中几乎无感,对开发工作是很大的帮助

Visual Studio Code

VS Code 是个后起之秀,功能强大且具有丰富的插件资源,无疑是这两年发展最快的综合开发工具。现在的版本配置 Python 虚拟环境很简单,只需要选择一个 Python 解释器就好了

同时按下 Ctrl+Shift+P, 在弹出的命令窗口中输入 "解析器",然后在下拉列表中选择 "Python:选择解析器",这里会缓存一些已经创建好的解析器,如果没有想要的,可以选择 "Enter interpreter path" 来选择解析器路径,即已经创建好的虚拟环境脚本文件夹中的 Python 程序,就可以创建一个新的解析器

选择 Python 解析器

如果编辑的是 Python 代码文件,在状态栏中也可以选择和切换解释器,更为方便

选择 Python 解析器

Pycharm

Pycharm 应该是功能最好的 Python 开发工具,转为 Python 开发而生,除了基本的开发功能外,还提供项目创建、打包、测试等丰富功能,有很大的市场占有率

创建项目时,在项目创建对话框中,可以创建或者选择已经已有的解析器

选择 Python 解析器

选择创建新的解析器时,需要选择创建虚拟环境的工具,如 virtualenv;指定虚拟环境的目录;选择 Python 基础解析器,同 virtualenv 工具的 -p 参数的效果;以及是否要继承基础解析器的第三方库 和 是否将这个虚拟环境作为默认环境,即创建其他项目时默认选择

如果选择已存在的解析器,和 VS Code 差不多,可以选择已经缓存的或者指定解析器的路径

部署虚拟环境

之所以在开发时选择虚拟环境,除了避免库之间的冲突,还有重要的原因是方便部署,因为虚拟环境是独立的,仅包含了项目相关的依赖库,所以部署的效率更高,风险更小

一般部署流程是:

  1. 开发完成后,使用 pip freeze > requirements.txt 命令将项目的库依赖导出,作为代码的一部分
  2. 将代码上传到服务器
  3. 在服务器上创建一个虚拟环境
  4. 激活虚拟环境,执行 pip install -r requirements.txt,安装项目依赖

怎么运行项目,需要看项目的具体情况

  • Web 项目 Web 项目一般使用 Django、Flask 的 Web 开发的提供 Web 服务的项目,部署时需要一个 Web 容器,作为程序的运行环境,容器的配置中都有一个虚拟环境的设置,其实是指定 Python 解析器的路径,将其设置为虚拟环境的目录或者 Python 解析器就可以了,启动时就用使用虚拟环境,并与其他环境隔离。例如 uWSGI 配置文件中 home 参数是用来指定解析器的。
  • 服务类项目 服务类项目就是需要以服务的形式长时间运行的,例如之前介绍的 公交闹钟,或者一些定时爬虫之类的,对于 Linux 而言,当前主流的服务方式是 Systemd,是一种比 init 更先进的服务管理工具,在服务脚本中, 设置 ExecStart 执行命令为全路径的虚拟环境的 Python 解析器,服务启动时,使用独立的虚拟环境了。Windows 服务,对于达成 EXE 包的,不需要配置虚拟环境,因为打包时已经考虑了环境问题了,如果是脚本运行的话,需要指定全路径的 Python 解析器
  • 单次运行项目 对于一些测试或者实验性质的项目,大多数情况下手动执行,只要在激活的虚拟环境下,或者用特定的 Python 解析器运行就好了,和在开发过程中运行区别不大

其他虚拟环境管理工具

  • virtualenvwrapper:是对 virtualenv 的一个封装,还有针对 vim 用户和 emacs 用户的 扩展,能支持 bash/ksh/zsh
  • virtualenvwrapper-win:针对 Windows batch shell 的 virtualenvwrapper
  • pyenv:用来解决这类问题。它可以安装、卸载、编译、管理多个 python 版本,并随时将其中一个设置为工作环境
  • pyenv-win:针对 Windows 的 pyenv

有兴趣的话可以试用一下

总结

今天主要了解了 Python 虚拟环境的相关概念和工具,并简单描述了实际工作中的一些使用方式,以便能在开发过程中使用。限于篇幅,没法就更多的内容详细展开,需要在实践中多试多用,Just DO It!

参考

  • https://docs.python.org/3/tutorial/venv.html
  • http://greyli.com/back-to-virtualenv-venv-and-pip/
  • https://www.jianshu.com/p/dcb281ee564e
  • https://blog.csdn.net/SpuerCheng/article/details/81485154
  • https://www.cnblogs.com/qinhan/p/9293126.html

觉得不错,请点个在看

sandboxie游戏不能运行在虚拟环境中如何解决_Python虚拟环境看这一篇就够了相关推荐

  1. Java中的多线程你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  2. Java 中的多线程你只要看这一篇就够了

    作者丨纳达丶无忌 https://www.jianshu.com/p/40d4c7aebd66 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多 ...

  3. java中怎么判断一段代码时线程安全还是非线程安全_Java 中的多线程你只要看这一篇就够了...

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  4. 【HTML 教程系列第 22 篇】 HTML 中的 input 标签,看这一篇就够了

    这是[HTML 教程系列第 22 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是 input 标签 ? 二:input 标签中 type 属性取值有哪些 ? 1:text 单行文本框 2 ...

  5. eclipse git 取远程代码_IDEA中的Git操作,看这一篇就够了!

    大家在使用Git时,都会选择一种Git客户端,在IDEA中内置了这种客户端,可以让你不需要使用Git命令就可以方便地进行操作,本文将讲述IDEA中的一些常用Git操作. SpringBoot实战电商项 ...

  6. JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了

    JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了! 常量池详解 1. 字面量和符号引用 1.1 字面量 1.2 符号引用 2. 常量池vs运行时常量池 3. 常 ...

  7. sandboxie游戏不能运行在虚拟环境中如何解决_知名经典的沙盒虚拟环境软件Sandboxie 免费了...

    Sandboxie 是一款非常经典老牌的沙盒程序/沙盘工具,功能类似以前的"影子系统",它可以在 Windows 上创造出一个虚拟的程序运行环境,并牢牢地限制住软件只能在其&quo ...

  8. sandboxie游戏不能运行在虚拟环境中如何解决_Sandboxie:这款曾卖一百多的知名沙盘软件,现在免费开源了...

    本文原创首发于微信公众号"WhiteApple"转载请先联系,部分素材来源网络,侵删 1 沙盘又叫沙箱.沙盒,应该大部分小伙伴都至少听过这个名字,但是真正了解这个东西的人可能就比较 ...

  9. sandboxie游戏不能运行在虚拟环境中如何解决_Mac系统运行“exe”文件最简单的解决办法...

    macOS是苹果公司为Mac系列产品开发的专属操作系统.macOS是苹果Mac系列产品的预装系统,处处体现着简洁的宗旨. 不过目前Windows是工作与办公使用的最普遍的系统,用苹果的设备有时候也需要 ...

最新文章

  1. Python-PyCharm 报错解决:ImportError: cannot import name 'InteractiveConsole' from 'code'
  2. 2021年春季学期-信号与系统-第六次作业参考答案-第八小题
  3. $.post()提交了数据,return不给跳转
  4. hdu 3999The order of a Tree
  5. 云计算与星辰大海的结合——不要回答,来自百亿光年外的未知信号
  6. html和jsp的差异
  7. ILSpy For MacOsX
  8. 华表Cell应用 - 使用XML自动读入数据 | #报表 #华表Cell
  9. Python数据处理(一)
  10. 测试工程师的福利!各远程移动测试平台对比分析
  11. 最优潮流 OPF 算例资源网站
  12. c-lodop自定义分页打印
  13. 如何查看IE浏览器版本?在线检测IE版本号
  14. (转)blackrock的阿拉丁系统与风险管理
  15. 简账(开源记账软件)-功能介绍
  16. Hive 3.1.2Linux CentOs 安装,踩坑 Dbeaver 连接Hive
  17. SeNet--通道注意力卷积
  18. E01-前端整合:【案例】添加数据页面
  19. 扦插技术图解_桂花的扦插方法(图解)
  20. Java面试锦囊(四)

热门文章

  1. 超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等...
  2. 给企业研发人员列一张数学清单【转载】
  3. [java篇]包和继承,组合
  4. Android加载长图滑动显示
  5. linux yy命令如何使用,Linux常用终端操作命令
  6. php7安装xhprof,php7中使用 xhprof 分析
  7. 第四章 投资性房地产
  8. 汇票(Bill of Exchange,Draft)
  9. B站播放量2万!保姆级PyTorch环境安装教程
  10. Unity 打包 Android API 26